是否有可能以某種方式never從打字稿中的型別中省略所有型別?我有一個型別,它采用另外兩種型別,并基于值生成第三種型別,并將所有不正確或不同值的元素設定為從不:
type MapForeignKeys<TExpandMap extends expandMap, TForeignKeys> = {
[Prop in keyof TExpandMap]:
TExpandMap[Prop] extends { association: 'belongsTo', instance: BaseModel, foreignKey: any }
? TExpandMap[Prop]['instance']['_creationAttributes'] | TExpandMap[Prop]['instance'] | TForeignKeys[TExpandMap[Prop]['foreignKey']]
: never
}
當我嘗試使用此型別時,輸出包含應設定為 的屬性never,而不是從型別定義中省略這些型別,因此這變得不可用。
可以在此操場鏈接中找到一個描述我的問題的簡單示例
編輯:一個帶有一些可重現問題示例的新鏈接
uj5u.com熱心網友回復:
省略鍵的一種可能方法是as在映射型別中使用子句。
您可以
never通過條件型別生成來過濾鍵
type OmitNever<T> = { [K in keyof T as T[K] extends never ? never : K]: T[K] }
所以在這里我們用鍵替換具有never值的never鍵,最終它們被省略。
操場
uj5u.com熱心網友回復:
考慮這個例子:
type WithNever = {
a: string
b: never
}
type Values<T> = T[keyof T]
type OmitNever<T> = Pick<T, Values<{
[Prop in keyof T]: [T[Prop]] extends [never] ? never : Prop
}>>
type Result = OmitNever<WithNever>
const test: OmitNever<WithNever> = {
a: 'test'
}; // ok
操場
OmitNever- 遍歷每個鍵并檢查它是否never存在。如果它保持never原樣,否則用鍵名替換值型別。
然后Values獲得所有產生值的聯合。請記住,我們最終得到了物件,其中每個值都是條件型別的結果。
如果我們有一個與neverlike的聯合"a" | never,TS 將洗掉never并只離開a。因此,Values回傳所有有效鍵的聯合。
最后一步,我們只使用Pick所有有效鍵的聯合
如果您想知道我為什么在這里使用方括號[T[Prop]] extends [never]- 請參閱此答案
更新
// type Test = {
// [x: string]: never;
// foreignObject: string | number;
// manyObject: never;
// }
type Test = MapForeignKeys<expands, foreignKeys>
你確定它MapForeignKeys按預期作業嗎?因為它回傳并索引物件,其中每個值都應該是never.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349978.html
標籤:打字稿
