3 回答

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)在做確保它存在的工作,并且打字稿總是告訴您它可能是未定義的,這可能會令人沮喪。

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
添加回答
舉報