如何在TypeScript中正確的遍歷一個對象
JavaScript
在講解用 Ts 遍歷一個對象之前, 我們先說說 在 Js 中怎么實現(xiàn), for...in、Object.keys, 一個簡單的例子:
// for...in
const obj = {
name: 'itsuki',
address: 'hangzhou',
};
for (const key in obj) {
console.log(key, obj[key].toUpperCase());
}
// Object.keys
Object.keys(obj).forEach(key => {
console.log(key, obj[key].toUpperCase());
});
// 輸出
// name ITSUKI
// address HANGZHOUTypeScript
for...in
但是在 TypeScript 中, 如果你直接這么用的話, 發(fā)現(xiàn)會報錯.
type Person = {
name: string;
address: string;
};
const obj: Person = {
name: 'itsuki',
address: 'hangzhou',
};
function print(obj: Person) {
for (const key in obj) {
// ?
// key:string 不能分配給 { name:string; age:number }類型
console.log(key, obj[key].toUpperCase());
}
}
print(obj)我們知道for...in、Object.keys拿到的是對象的 key, 而在對象中所有的 key 都是字符串, 所以它無法分配給Person的name、address.
但是我們可以keyof來解決這個問題.
function print(obj:Person){
let key: keyof Person;
for (key in obj) {
// ?
console.log(key, obj[key].toUpperCase());
}
}Object.keys
在使用Object.keys時, 我們可以使用as運(yùn)算符來解決.
function print(obj: Person) {
Object.keys(obj).forEach((k) => {
// ?
console.log(k, obj[k as keyof Person].toUpperCase());
});
}我們可以把這個抽離出一個函數(shù):
function getKeys<T>(obj: T) {
return Object.keys(obj) as Array<keyof T>;
}
getKeys(obj); // (keyof Person)[]Object.entries
我們也可以使用Object.entries()來遍歷對象.
Object.entries(obj).forEach(([k, v]) => {
console.log(k, v);
});思考
以下是我自己的思考, 如有錯誤, 請指正
我想Object.keys()返回的是一個string[], 是因為它是在運(yùn)行時確定的, 我們知道TypeScript做的只是靜態(tài)類型的檢查, 即使我們使用keyof Person返回了 name | address, 但是我們不能肯定在運(yùn)行時它就是這兩個字段.
比如說:
const obj2 = {
name: 'itsuki',
address: 'hangzhou',
age: 20,
};
print(obj2)
// 編譯時: ?, 因為它有name、address屬性
// 運(yùn)行時: ?, 因為age字段是number, 沒有toUpperCase方法然后我在 Github issue 里面找到這一句話:
TS 中的類型是開放式的。因此, keysof 可能會少于在運(yùn)行時獲得的所有屬性。
它更要我明白了, 為什么keys()返回的是一個string[], 而不是一個(keyof Person)[].
總結(jié)
到此這篇關(guān)于如何在TypeScript中正確的遍歷一個對象的文章就介紹到這了,更多相關(guān)Ts遍歷對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript結(jié)合Canvas繪畫畫運(yùn)動小球
這篇文章主要介紹了JavaScript結(jié)合Canvas畫運(yùn)動小球,canvas被稱為畫布,可以結(jié)合javascript實現(xiàn)繪制各種圖形,制作各種炫酷的動畫效果,下面文章更多詳細(xì)內(nèi)容介紹需要的小伙伴可以參考一下2022-03-03
bootstrap datepicker插件默認(rèn)英文修改為中文
這篇文章主要為大家詳細(xì)介紹了bootstrap datepicker插件默認(rèn)英文修改為中文的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07
JavaScript手寫數(shù)組的常用函數(shù)總結(jié)
這篇文章主要給大家介紹了關(guān)于JavaScript手寫數(shù)組常用函數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
VS Code轉(zhuǎn)換大小寫、修改選中文字或代碼顏色的方法
最近在使用VS Code,發(fā)現(xiàn)了不少使用的小技巧,覺著有必要給大家分享下,下面這篇文章主要給大家介紹了關(guān)于VS Code轉(zhuǎn)換大小寫、修改選中文字或代碼顏色的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-12-12

