鑒于以下介面:
interface Entity {
A: boolean;
B: string;
C: number;
D: never
}
我想創建一個忽略extends never. 類似的東西:
type FilteredEntity = OmitNever<Entity>; // = { A: boolean; B: string; C: number };
OmitNever應該如何實施?
uj5u.com熱心網友回復:
以下是我將如何解決您的問題:
interface Entity {
A: boolean;
B: string;
C: number;
D: never
}
type Entries<T> = {
[K in keyof T]: [K, T[K]]
}[keyof T]
type EntriesWithValueOfType<T, U> = T extends [any, U] ? T : never;
type EntityNeverEntries = EntriesWithValueOfType<Entries<Entity>, never>
type KeysOfEntries<T> = T extends [infer U, any] ? U : never;
type OmitNever = Omit<Entity, KeysOfEntries<EntityNeverEntries>>
打字稿游樂場
uj5u.com熱心網友回復:
我想你需要這樣的東西
// Omit a single property:
type FilteredEntity = Omit<Entity, "D">;
// Equivalent to: {A: boolean, B: string, C: number}
并且永遠
type Keys_NeverExcluded<T> =
{ [K in keyof T]: T[K] extends never ? never : K }[keyof T]
type FilteredEntity = Pick<Entity, Keys_NeverExcluded<Entity>>
現在,如果你嘗試過類似的東西
const p: FilteredEntity = {A: true, B: "test", C: 3, D: null}
它會告訴你
Type '{ A: true; B: string; C: number; D: null; }' is not assignable to type 'FilteredEntity'.
Object literal may only specify known properties, and 'D' does not exist in type 'FilteredEntity'.
游樂場:https : //tsplay.dev/wg6qlW
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/383514.html
上一篇:從相交型別構造完整型別
