typescript中使用Object.keys


開發中使用typescript的時候,經常會遇到使用 Object.keys 這個方法報錯的情況,報錯如下:

錯誤場景1

var foo = {
    a: '1',
    b: '2'
}

var getPropertyValue = Object.keys(foo).map(item => foo[item]) // 這里會有typescript的錯誤提示

 錯誤場景2

var foo = {
    a: '1',
    b: '2'
}

function getPropertyValue(obj, key) { // 這里也會提示obj會有any類型 return obj[key]
}

 

場景1解決方案:

通過 keyof 的方式可以獲取ts 類型的屬性key的值

 

var foo = {
    a: '1',
    b: '2'
}
// 這里typeof foo => foo的類型 等同於 interface Foo { a: string; b: string; }
// typeof foo === Foo,這里只所以用 typeof foo,因為這樣方便,對於不想寫interface的直接量對象很容易獲取它的類型
// keyof typeof foo這里只獲取 Foo的類型key值,注意這個keyof后面一定是 typescript的類型
type FooType = keyof typeof foo; 

var getPropertyValue = Object.keys(foo).map(item => foo[item as FooType])

 

場景2解決方案:

var foo = {
    a: '1',
    b: '2'
}
// 這里聲明了兩個泛型 TK
// T
代表函數第一個參數的類型,K 代表函數第二個參數的類型這個類型指向第一個參數類型中包含的key的值
function getPropertyValue<T, K extends keyof T>(obj:T, key:K):T[K] { return obj[key] } getPropertyValue(foo, 'a')

 

總結:

這里涉及到typescript的兩個知識點

1、keyof的用法

2、泛型的用法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM