最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何在TypeScript中正確的遍歷一個(gè)對(duì)象

 更新時(shí)間:2022年03月28日 15:59:32   作者:你要不要喝奶茶  
在TypeScript里面,也會(huì)遇到需要遍歷對(duì)象的時(shí)候,下面這篇文章主要給大家介紹了關(guān)于如何在TypeScript中正確的遍歷一個(gè)對(duì)象的相關(guān)資料,需要的朋友可以參考下

JavaScript

在講解用 Ts 遍歷一個(gè)對(duì)象之前, 我們先說(shuō)說(shuō) 在 Js 中怎么實(shí)現(xiàn), for...in、Object.keys, 一個(gè)簡(jiǎn)單的例子:

// 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 HANGZHOU

TypeScript

for...in

但是在 TypeScript 中, 如果你直接這么用的話(huà), 發(fā)現(xiàn)會(huì)報(bào)錯(cuò).

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 }類(lèi)型
    console.log(key, obj[key].toUpperCase());
  }
}
print(obj)

我們知道for...in、Object.keys拿到的是對(duì)象的 key, 而在對(duì)象中所有的 key 都是字符串, 所以它無(wú)法分配給Person的name、address.

但是我們可以keyof來(lái)解決這個(gè)問(wèn)題.

function print(obj:Person){
  let key: keyof Person;
  for (key in obj) {
    // ?
    console.log(key, obj[key].toUpperCase());
  }
}

Object.keys

在使用Object.keys時(shí), 我們可以使用as運(yùn)算符來(lái)解決.

function print(obj: Person) {
  Object.keys(obj).forEach((k) => {
    // ?
    console.log(k, obj[k as keyof Person].toUpperCase());
  });
}

我們可以把這個(gè)抽離出一個(gè)函數(shù):

function getKeys<T>(obj: T) {
  return Object.keys(obj) as Array<keyof T>;
}
getKeys(obj); // (keyof Person)[]

Object.entries

我們也可以使用Object.entries()來(lái)遍歷對(duì)象.

Object.entries(obj).forEach(([k, v]) => {
  console.log(k, v);
});

思考

以下是我自己的思考, 如有錯(cuò)誤, 請(qǐng)指正

我想Object.keys()返回的是一個(gè)string[], 是因?yàn)樗窃谶\(yùn)行時(shí)確定的, 我們知道TypeScript做的只是靜態(tài)類(lèi)型的檢查, 即使我們使用keyof Person返回了 name | address, 但是我們不能肯定在運(yùn)行時(shí)它就是這兩個(gè)字段.

比如說(shuō):

const obj2 = {
  name: 'itsuki',
  address: 'hangzhou',
  age: 20,
};

print(obj2)
// 編譯時(shí): ?, 因?yàn)樗衝ame、address屬性
// 運(yùn)行時(shí): ?, 因?yàn)閍ge字段是number, 沒(méi)有toUpperCase方法

然后我在 Github issue 里面找到這一句話(huà):

TS 中的類(lèi)型是開(kāi)放式的。因此, keysof 可能會(huì)少于在運(yùn)行時(shí)獲得的所有屬性。

它更要我明白了, 為什么keys()返回的是一個(gè)string[], 而不是一個(gè)(keyof Person)[].

總結(jié)

到此這篇關(guān)于如何在TypeScript中正確的遍歷一個(gè)對(duì)象的文章就介紹到這了,更多相關(guān)Ts遍歷對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 從javascript語(yǔ)言本身談項(xiàng)目實(shí)戰(zhàn)

    從javascript語(yǔ)言本身談項(xiàng)目實(shí)戰(zhàn)

    從javascript語(yǔ)言本身談項(xiàng)目實(shí)戰(zhàn)...
    2006-12-12
  • JavaScript函數(shù)封裝的示例詳解

    JavaScript函數(shù)封裝的示例詳解

    這篇文章主要通過(guò)動(dòng)畫(huà)的示例來(lái)為大家詳細(xì)介紹一下JavaScript的函數(shù)封裝,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下
    2022-03-03
  • JavaScript結(jié)合Canvas繪畫(huà)畫(huà)運(yùn)動(dòng)小球

    JavaScript結(jié)合Canvas繪畫(huà)畫(huà)運(yùn)動(dòng)小球

    這篇文章主要介紹了JavaScript結(jié)合Canvas畫(huà)運(yùn)動(dòng)小球,canvas被稱(chēng)為畫(huà)布,可以結(jié)合javascript實(shí)現(xiàn)繪制各種圖形,制作各種炫酷的動(dòng)畫(huà)效果,下面文章更多詳細(xì)內(nèi)容介紹需要的小伙伴可以參考一下
    2022-03-03
  • bootstrap datepicker插件默認(rèn)英文修改為中文

    bootstrap datepicker插件默認(rèn)英文修改為中文

    這篇文章主要為大家詳細(xì)介紹了bootstrap datepicker插件默認(rèn)英文修改為中文的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • JavaScript手寫(xiě)數(shù)組的常用函數(shù)總結(jié)

    JavaScript手寫(xiě)數(shù)組的常用函數(shù)總結(jié)

    這篇文章主要給大家介紹了關(guān)于JavaScript手寫(xiě)數(shù)組常用函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • VS Code轉(zhuǎn)換大小寫(xiě)、修改選中文字或代碼顏色的方法

    VS Code轉(zhuǎn)換大小寫(xiě)、修改選中文字或代碼顏色的方法

    最近在使用VS Code,發(fā)現(xiàn)了不少使用的小技巧,覺(jué)著有必要給大家分享下,下面這篇文章主要給大家介紹了關(guān)于VS Code轉(zhuǎn)換大小寫(xiě)、修改選中文字或代碼顏色的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-12-12
  • Bootstrap導(dǎo)航簡(jiǎn)單實(shí)現(xiàn)代碼

    Bootstrap導(dǎo)航簡(jiǎn)單實(shí)現(xiàn)代碼

    這篇文章主要介紹了Bootstrap導(dǎo)航的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Javascript實(shí)現(xiàn)計(jì)算個(gè)人所得稅

    Javascript實(shí)現(xiàn)計(jì)算個(gè)人所得稅

    用javascript腳本語(yǔ)言編寫(xiě)一個(gè)“個(gè)人所得稅計(jì)算器”?計(jì)算公式:所得稅=(月收入-起征額)*10%;重填就是全部清空;十分的實(shí)用,有需要的小伙伴可以參考下。
    2015-05-05
  • layui彈出框Tab選項(xiàng)卡的示例代碼

    layui彈出框Tab選項(xiàng)卡的示例代碼

    今天小編就為大家分享一篇layui彈出框Tab選項(xiàng)卡的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • js中獲取鍵盤(pán)事件的簡(jiǎn)單實(shí)現(xiàn)方法

    js中獲取鍵盤(pán)事件的簡(jiǎn)單實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇js中獲取鍵盤(pán)事件的簡(jiǎn)單實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10

最新評(píng)論

盖州市| 卓尼县| 平罗县| 宜宾市| 日照市| 广饶县| 临漳县| 临漳县| 凭祥市| 韶关市| 古交市| 河北区| 林周县| 台中县| 水城县| 安图县| 苍梧县| 阿勒泰市| 拉孜县| 淮阳县| 南汇区| 汶川县| 多伦县| 唐河县| 南丹县| 肃宁县| 清水河县| 德惠市| 友谊县| 齐河县| 洛川县| 长宁县| 天水市| 宜川县| 合阳县| 同仁县| 临洮县| 古蔺县| 大悟县| 霍林郭勒市| 洛阳市|