当(该属性的)通用参数为never
时,我需要一个通用类型将一个通用属性从指定类型中排除。为此,我使用了Omit
和条件类型。例如,当将通用参数设置为number
时,它的行为与预期的相同,但是当通用类型设置为never
时,该类型解析为never
而不是排除指定的属性( Playground):
type BaseType<T> = {
prop1: string;
genProp1: T;
};
type Excluded<T> = T extends never ? Omit<BaseType<T>, "genProp1"> : BaseType<T>;
const obj1: Excluded<number> = {
genProp1: 5,
prop1: "something, something"
};
//obj2 is never
const obj2: Excluded<never> = {
prop1: "dark side" //error: Type 'string' is not assignable to type 'never'
};
为什么要这样做,如何使它返回正确的类型({ prop1: string }
)?
编辑:与null
而不是never
相比,可以解决此问题。我仍然想知道使用never
时发生了什么。
答案 0 :(得分:1)
Conditional types distribute over naked type parameters。这意味着条件类型将应用于联合的每个成员。 never
被视为空联合。因此,条件类型永远不会得到应用(因为在联合中没有成员可以应用它)导致产生never
类型。
简单的解决方案是使用元组禁用条件类型的分布行为:
type BaseType<T> = {
prop1: string;
genProp1: T;
};
type Excluded<T> =
[T] extends [never] ? Omit<BaseType<T>, "genProp1"> : BaseType<T>;
const obj1: Excluded<number> = {
genProp1: 5,
prop1: "bla"
};
const obj2: Excluded<never> = {
prop1: "dwdadw"
};