我知道有一種動態生成型別的方法:Typescript dynamic create types based on object
但是我找不到使動態生成型別的某些屬性成為可選的方法。
例如,假設我有一個物件
const obj = {
keyName1: {
type: 'string',
required: true
},
keyName1: {
type: 'string',
required: false
},
}
如何基于此物件創建型別?鑒于某些屬性是可選的(如果需要是假的)。
如果我只是有這個物件:
const obj = {
keyName1: 'string'
}
我可以制作一個型別:
type Generate<T> = T;
type Generated = Generate<typeof myObj>
但是使用可選引數,我不知道如何...
uj5u.com熱心網友回復:
您首先需要一個實用程式型別,將每個型別字串(例如'string')映射到它的型別(string)。
然后,映射物件屬性并做Obj[K]['required'] extends true ?有條件地檢查是否交替undefined。有關如何從新物件中的非可選屬性中分離出可選屬性,請參閱此答案。
const obj = {
keyName1: {
type: 'string',
required: true
},
keyName2: {
type: 'number',
required: false
},
} as const;
type Obj = typeof obj;
type TypesByTypeof = {
'string': string;
'number': number;
}
type ObjType = {
[key in keyof Obj as Obj[key]['required'] extends true ? key : never]: TypesByTypeof[Obj[key]['type']]
} & {
[key in keyof Obj as Obj[key]['required'] extends false ? key : never]?: TypesByTypeof[Obj[key]['type']]
}
結果:
type ObjType = {
readonly keyName1: string;
} & {
readonly keyName2?: number | undefined;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/419270.html
標籤:
上一篇:Typescript無法縮小組件道具總和型別的函式簽名
下一篇:反應組件不在地圖回圈中呈現
