我有一個列舉,我想將它的值添加到介面中,但收到此錯誤:
介面中的計算屬性名稱必須參考型別為文字型別或“唯一符號”型別的運算式。 (1169)
https://www.typescriptlang.org/play?ts=4.5.2#code/KYOwrgtgBAYglsANgEwM5QN4CgpQOQgCGEweUAvPgGYIoCMeANDvoQOakW541LIBMTFngDGYVABcA9tF4oylHrWQBmIQF8sWOCAnAATlUIjgUAAoHUUkJhZxkALiiT9OtgG4WAbXh9UX0XFpWWU8AF0wgH4nFzdPdSA
如何使用列舉值作為介面屬性而不必使用反向鍵/值創建第二個列舉?
enum Fields {
'name' = 'field1',
'age' = 'field2',
'custom field' = 'field3',
}
interface Person {
id: string;
[Fields['custom field']]?: string;
}
uj5u.com熱心網友回復:
我認為您可以使用中間型別實作您想要的功能,如下所示:
enum Fields {
'name' = 'field1',
'age' = 'field2',
'custom field' = 'field3',
}
type FieldsObject = {
[K in Fields]? : string
}
interface Person extends FieldsObject {
id: string;
}
const p: Person = {
id: "abc",
field1: "",
field3: "",
}
TypeScript Playground 展示了這個
uj5u.com熱心網友回復:
我有一個解決方案,但它很難看:基本上,使用映射型別來定義該屬性,然后與常規物件型別相交以定義其余屬性。我曾經Simplify使結果更具可讀性。
type Simplify<T> = T extends unknown ? {[K in keyof T]: T[K]} : never
type Person = Simplify<{
id: string;
} & {
[K in typeof Fields['custom field']]?: string
}>
將滑鼠懸停Person在 Typescript Playground 上顯示結果等效于:
type Person = {
id: string;
field3?: string | undefined;
}
游樂場鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/373494.html
標籤:打字稿
