第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

TypeScript:訪問對象上未定義的鍵時返回的類型是錯誤的?

TypeScript:訪問對象上未定義的鍵時返回的類型是錯誤的?

qq_笑_17 2022-07-21 10:07:00
在 TypeScript 中使用帶有可變鍵的對象時,我注意到了意外的類型。給定以下代碼type MyType = {  [x: number] : number}const o : MyType = {  0: 1,}const a = o[0]; // Return type correctly identified as numberconst b = o[1]; // Return type should be undefined and compiler should not allow this我注意到,當(dāng)使用變量鍵[...]的語法定義對象類型時,無法正確檢測對象訪問使用的類型。[x: number]VSCode 向我展示了兩者a 都有btype number。類型不應(yīng)該是number | undefined因為它可能發(fā)生未定義鍵的情況嗎?登錄a到b控制臺時,a是一段number時間b是undefined.當(dāng)一個類型的對象MyType被傳遞給一個函數(shù)并且該函數(shù)訪問該對象中的一個鍵然后執(zhí)行以下操作時,問題變得更加嚴重:function fun(o: MyType) : number {   return o[10000] ?? null  // can be number or null at runtime}沒有顯示錯誤。但是當(dāng)代碼運行時,o[10000]未定義,因此返回值null不是有效數(shù)字。想象一下,使用這個返回值來執(zhí)行進一步的計算,這些計算都是基于一個有效數(shù)字的假設(shè)。這會導(dǎo)致編譯器應(yīng)該檢測到的運行時錯誤(如果我不理解完全錯誤的東西,我是 TS 新手)(這些示例中使用的 TypeScript 是由 create-react-app 配置的,我沒有更改任何設(shè)置)
查看完整描述

3 回答

?
30秒到達戰(zhàn)場

TA貢獻1828條經(jīng)驗 獲得超6個贊

類型不應(yīng)該是數(shù)字嗎?而是未定義,因為可能會發(fā)生未定義鍵的情況?

如果你愿意,你可以選擇;只需將其定義為:

type MyType = {
  [x: number] : number | undefined
  }

如果您希望訪問可能不存在的隨機屬性,這將很有用。

但另一方面,以更規(guī)范的方式使用對象以避免訪問不存在的屬性的可能性是相當(dāng)普遍的。例如,如果您通常編寫使用Object.keys(o)for ... in決定要訪問哪些屬性的代碼,那么您已經(jīng)在做確保它存在的工作,并且打字稿總是告訴您它可能是未定義的,這可能會令人沮喪。


查看完整回答
反對 回復(fù) 2022-07-21
?
動漫人物

TA貢獻1815條經(jīng)驗 獲得超10個贊

添加"noUncheckedIndexedAccess": true到您的 tsconfig.json 編譯器選項對象



查看完整回答
反對 回復(fù) 2022-07-21
?
明月笑刀無情

TA貢獻1828條經(jīng)驗 獲得超4個贊

您MyType定義了一個索引訪問器,它允許將任何數(shù)字用作對象的訪問器:


type MyType = {

  [x: number] : number

}

這意味著,就類型安全而言,任何數(shù)字都可用于使用索引訪問器訪問對象,類似于數(shù)組。


您的對象僅定義了一個屬性 - 但類型檢查器(編譯時間)不會查看您的對象,該對象是在運行時創(chuàng)建的。類型檢查器只知道 is MyType,任何數(shù)字都是一個有效值,可用于索引類型為 is 或 extends 的任何對象MyType。


您必須記住,您的對象在運行時仍然只是一個常規(guī)的舊 JavaScript 對象,一旦代碼編譯并運行,TypeScript 就不再適用。


如果您要定義具有一組屬性的類型,那么您應(yīng)該使用一組屬性來構(gòu)造您的類型,而不是使用索引訪問器:


interface MyType {

  0: number

}


const o: MyType = { 0: 1 } // valid

const o2: MyType = { 1: 1 } // type checking error

o[0] // valid

o[1] // type checking error 


查看完整回答
反對 回復(fù) 2022-07-21
  • 3 回答
  • 0 關(guān)注
  • 140 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號