如何在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運算符來解決.
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[], 是因為它是在運行時確定的, 我們知道TypeScript做的只是靜態(tài)類型的檢查, 即使我們使用keyof Person返回了 name | address, 但是我們不能肯定在運行時它就是這兩個字段.
比如說:
const obj2 = {
name: 'itsuki',
address: 'hangzhou',
age: 20,
};
print(obj2)
// 編譯時: ?, 因為它有name、address屬性
// 運行時: ?, 因為age字段是number, 沒有toUpperCase方法然后我在 Github issue 里面找到這一句話:
TS 中的類型是開放式的。因此, keysof 可能會少于在運行時獲得的所有屬性。
它更要我明白了, 為什么keys()返回的是一個string[], 而不是一個(keyof Person)[].
總結
到此這篇關于如何在TypeScript中正確的遍歷一個對象的文章就介紹到這了,更多相關Ts遍歷對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
LayUi中接口傳數(shù)據(jù)成功,表格不顯示數(shù)據(jù)的解決方法
今天小編就為大家分享一篇LayUi中接口傳數(shù)據(jù)成功,表格不顯示數(shù)據(jù)的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
在js中判斷checkboxlist(.net控件客戶端id)是否有選中
添加或修改內(nèi)容時,需要對關鍵數(shù)據(jù)進行判空處理,checkboxlist是否有選擇項如何使用js判斷實現(xiàn),接下來為大家詳細介紹下實現(xiàn)方法,感興趣的朋友可以參考下哈2013-04-04
微信小程序wx.request實現(xiàn)后臺數(shù)據(jù)交互功能分析
這篇文章主要介紹了微信小程序wx.request實現(xiàn)后臺數(shù)據(jù)交互功能,分析微信小程序wx.request在后臺數(shù)據(jù)交互過程中遇到的問題與相關的解決方法,需要的朋友可以參考下2017-11-11
基于VSCode調(diào)試網(wǎng)頁JavaScript代碼過程詳解
這篇文章主要介紹了基于VSCode調(diào)試網(wǎng)頁JavaScript代碼過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07
javascript檢查表單數(shù)據(jù)是否改變的方法
需要檢查用戶是否修改了一個表單中的內(nèi)容,可以使用本文提供的方法,如果修改了表單的內(nèi)容則返回true,沒修改則返回false,有需求的朋友可以參考下2013-07-07
javascript利用初始化數(shù)據(jù)裝配模版的實現(xiàn)代碼
實現(xiàn)一個通用方法,使用初始化數(shù)據(jù)來裝配模版。需要的朋友可以參考下。2010-11-11

