And*_*i V 5 generics typescript conditional-types
我需要一个泛型类型,当(此属性的)泛型参数为 时,该泛型类型可以从指定类型中排除泛型属性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'
};
Run Code Online (Sandbox Code Playgroud)
为什么要这样做以及如何让它返回正确的类型 ( { prop1: string }
)?
编辑:比较而null
不是never
解决问题。我仍然想知道我使用时发生了什么never
。
条件类型分布在裸类型参数上。这意味着条件类型将应用于联合的每个成员。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"
};
Run Code Online (Sandbox Code Playgroud)