例如我在 JS 上有這個資料
const obj = { // never have 'c' property
a: 1,
b: 2,
}
const keys = ['a', 'b', 'c'] // always 'a'|'b'|'c' --> ex: [a,b,c] / [c,b,a] / [a,c]
const firstKey = keys[0]
const selectedObj = obj?.[firstKey] || 99
現在如何在打字稿中做到這一點?我已經嘗試過了,但堅持使用這樣的解決方案
type Keys = 'a' | 'b' | 'c'
type ObjKey = Exclude<Keys, 'c'>
type Obj = Record<ObjKey, number>
const obj: Obj = {
a: 1,
b: 2,
}
const keys: Keys[] = ['a', 'b', 'c']
const firstKey = keys[0] as ObjKey // --> I don't think this is right
const selectedObj = obj?.[firstKey] || 99
我認為這是不對的,因為這樣做我消除了運行時檢查的可能性,firstKey使其具有 value 'c'。想知道解決這個問題的正確/正確方法是什么?我希望能夠訪問selectedObj,但 TS 尖叫
Property 'c' does not exist on type 'Obj'
uj5u.com熱心網友回復:
您需要做的就是更改以下行:
type Obj = Record<ObjKey, number>
至
type Obj = Partial<Record<Keys, number>>
解釋:
在您的問題中,您表示希望 TypeScript 發出警告/錯誤,即obj?.[firstKey]可能未定義訪問的屬性,這將迫使開發人員對其添加運行時檢查。在提供的示例中,我們可以看到所有obj屬性都已定義,TypeScript 會立即抱怨它在運行時的使用。obj解決方法是使用Partial實用程式型別使所有屬性成為可選。這將告訴 TypeScript 被訪問的屬性可能已定義也可能未定義,因此開發人員需要添加代碼才能使用它。
這是一個 ts 游樂場鏈接。
uj5u.com熱心網友回復:
在您的情況下,您提到物件鍵不會更改,我建議您替換它:
type Keys = 'a' | 'b' | 'c'
type ObjKey = Exclude<Keys, 'c'>
和:
const keys = ['a', 'b', 'c'] as const;
type ObjKey = Exclude<typeof keys[number], 'c'>
通過這樣做,您正在創建一個名為const 斷言的打字稿構造,它允許您擁有一個不可變的物件。
更多檔案:https ://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#const-assertions
然后,您通常可以在firstKey變數上使用型別注釋而不會收到任何錯誤。
const firstKey: ObjKey = keys[0];
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/486013.html
標籤:javascript 反应 打字稿
