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

在Typescript中如何使用for...in詳解

 更新時(shí)間:2022年03月15日 09:23:58   作者:最后的Hibana  
這篇文章主要給大家介紹了關(guān)于在Typescript中如何使用for...in的相關(guān)資料,以及TypeScript中使用for...in遍歷對(duì)象屬性會(huì)報(bào)錯(cuò)的解決辦法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

如何在Typescript中使用for...in ?本人在TS中用for...in出現(xiàn)了些問(wèn)題,也想到了一些解決方法。那么先來(lái)看看下面報(bào)錯(cuò)的代碼吧。

interface ABC {
    a: string
    b: string
}
const x: ABC = {
    a:'1',
    b:'2'
}
const y: ABC = {
    a:'3',
    b:'4'
}
for (const key in x) {
// 在類(lèi)型 "ABC" 上找不到具有類(lèi)型為 "string" 的參數(shù)的索引簽名。ts(7053)
    x[key] = y[key]
}

這由于在for...in循環(huán)時(shí),也會(huì)遍歷繼承的屬性,所以不能判斷key的類(lèi)型,只能是string類(lèi)型。如果用Object的hasOwnProperty方法呢,然而并沒(méi)有用,TS還是認(rèn)為key是string類(lèi)型。這時(shí)候需要自己封裝一下hasOwnProperty方法。

function hasOwnProperty<T, K extends PropertyKey>(
    obj: T,
    prop: K
): obj is T & Record<K, unknown> {
    return Object.prototype.hasOwnProperty.call(obj, prop);
}
for (const key in x) { 
    if (hasOwnProperty(y,key) && hasOwnProperty(x,key)) {
        x[key] = y[key]
        //可以看到let x: ABC & Record<string, unknown>
        //x的類(lèi)型變異了
    } 
}

這樣就好了,這可也實(shí)在是太麻煩了。我只是遍歷一個(gè)簡(jiǎn)單對(duì)象,為何要搞得這么麻煩,當(dāng)然還是有簡(jiǎn)單方法的。只要循環(huán)的時(shí)候這樣寫(xiě)就好了。

let key:keyof ABC
for (key in x) {
    x[key] = y[key]
}

是不是很簡(jiǎn)單,然而當(dāng)我把接口ABC的a類(lèi)型改成number的時(shí)候,ts又報(bào)錯(cuò)了。

//不能將類(lèi)型“string | number”分配給類(lèi)型“never”。
//不能將類(lèi)型“string”分配給類(lèi)型“never”。ts(2322)

WTF,為啥x[key]類(lèi)型變成never了?因?yàn)樵谫x值的時(shí)候,x[key]有兩種類(lèi)型的可能,永遠(yuǎn)不可能賦值它兩個(gè)類(lèi)型,所以是never?(個(gè)人猜想)。如果用之前那種方法也是報(bào)一樣的錯(cuò)誤。由于never是TS中最底層的類(lèi)型,never 僅能被賦值給另外一個(gè) never 類(lèi)型,所以x[key]不能被賦值了。 這可怎么辦呢,沒(méi)辦法了,只能使用最后的方法了!

let key:keyof ABC
//@ts-ignore
for (key in x) {
    x[key] = y[key]
}

補(bǔ)充:TypeScript中使用for...in遍歷對(duì)象屬性會(huì)報(bào)錯(cuò)的解決辦法

最近有一個(gè)用ts寫(xiě)的react項(xiàng)目,在里面使用for…in遍歷對(duì)象屬性時(shí)報(bào)了個(gè)錯(cuò),類(lèi)似下面這種:
解決辦法:在 tsconfig.json 文件中加入下面被注釋掉的那一行代碼,即把 抑制隱式索引錯(cuò)誤 置為真

"compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    // "suppressImplicitAnyIndexErrors": true,
    "importHelpers": true,
    "jsx": "react-jsx",
    "esModuleInterop": true,
    "sourceMap": true,
    "baseUrl": "./",
    "strict": true,
    "paths": {
      "@/*": ["src/*"],
      "@@/*": ["src/.umi/*"]
    },
    "allowSyntheticDefaultImports": true
  },

總結(jié)

到此這篇關(guān)于在Typescript中如何使用for...in的文章就介紹到這了,更多相關(guān)Typescript中使用for...in內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS時(shí)間戳轉(zhuǎn)換為常用時(shí)間格式的三種方式

    JS時(shí)間戳轉(zhuǎn)換為常用時(shí)間格式的三種方式

    我們?cè)陂_(kāi)發(fā)中經(jīng)常需要把時(shí)間戳轉(zhuǎn)化成日期格式,下面這篇文章主要給大家介紹了關(guān)于JS時(shí)間戳轉(zhuǎn)換為常用時(shí)間格式的三種主要方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • js頁(yè)面引導(dǎo)頁(yè)的實(shí)現(xiàn)思路總結(jié)

    js頁(yè)面引導(dǎo)頁(yè)的實(shí)現(xiàn)思路總結(jié)

    在同學(xué)們使用某些網(wǎng)站的新版本頁(yè)面的時(shí)候,經(jīng)常會(huì)出現(xiàn)一個(gè)類(lèi)似于新手引導(dǎo)一樣的效果,本文主要介紹了js頁(yè)面引導(dǎo)頁(yè)的實(shí)現(xiàn)思路總結(jié),感興趣的可以了解一下
    2023-04-04
  • 小程序?qū)崿F(xiàn)篩子抽獎(jiǎng)

    小程序?qū)崿F(xiàn)篩子抽獎(jiǎng)

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)篩子抽獎(jiǎng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 如何在JavaScript?中獲取域名

    如何在JavaScript?中獲取域名

    本文將討論如何使用?JavaScript?事件和函數(shù)在網(wǎng)頁(yè)執(zhí)行期間以編程方式獲取域名,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-06-06
  • JS實(shí)現(xiàn)的網(wǎng)頁(yè)上的顏色拾色器

    JS實(shí)現(xiàn)的網(wǎng)頁(yè)上的顏色拾色器

    這篇文章主要介紹了JS實(shí)現(xiàn)網(wǎng)頁(yè)上的顏色拾色器,需要的朋友可以參考下
    2016-04-04
  • JS實(shí)現(xiàn)利用閉包判斷Dom元素和滾動(dòng)條的方向示例

    JS實(shí)現(xiàn)利用閉包判斷Dom元素和滾動(dòng)條的方向示例

    這篇文章主要介紹了JS實(shí)現(xiàn)利用閉包判斷Dom元素和滾動(dòng)條的方向,涉及javascript閉包、事件響應(yīng)及頁(yè)面元素屬性動(dòng)態(tài)操作相關(guān)使用技巧,需要的朋友可以參考下
    2019-08-08
  • JS實(shí)現(xiàn)Fisheye效果動(dòng)感放大菜單代碼

    JS實(shí)現(xiàn)Fisheye效果動(dòng)感放大菜單代碼

    這篇文章主要介紹了JS實(shí)現(xiàn)Fisheye效果動(dòng)感放大菜單代碼,涉及JavaScript事假監(jiān)聽(tīng)機(jī)制及定時(shí)函數(shù)等相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • GoJs的文本繪圖模板TextBlock使用實(shí)例

    GoJs的文本繪圖模板TextBlock使用實(shí)例

    這篇文章主要為大家介紹了GoJs的文本繪圖模板TextBlock使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • JS中數(shù)學(xué)計(jì)算精度問(wèn)題的解決方案

    JS中數(shù)學(xué)計(jì)算精度問(wèn)題的解決方案

    這篇文章主要給大家介紹了JS中數(shù)學(xué)計(jì)算精度問(wèn)題的解決方案,文中通過(guò)代碼示例和圖文結(jié)合給大家講解非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • window resize和scroll事件的基本優(yōu)化思路

    window resize和scroll事件的基本優(yōu)化思路

    在項(xiàng)目中使用scroll事件去加載數(shù)據(jù),結(jié)果IE下悲劇了。下面為大家介紹下window resize和scroll事件的基本優(yōu)化思路,需要的朋友可以參考下
    2014-04-04

最新評(píng)論

曲麻莱县| 蒙城县| 叙永县| 鹤峰县| 汾西县| 常山县| 崇左市| 陆良县| 六枝特区| 通河县| 栖霞市| 大悟县| 神农架林区| 南平市| 宣恩县| 新绛县| 安平县| 阿瓦提县| 肃南| 连南| 江门市| 江北区| 巴林右旗| 札达县| 武夷山市| 博乐市| 衡阳市| 房产| 双峰县| 淄博市| 乌鲁木齐县| 玛多县| 鹤峰县| 工布江达县| 姜堰市| 永宁县| 交口县| 浠水县| 堆龙德庆县| 临安市| 诏安县|