我需要一个泛型类型,当(该属性的)泛型参数为时,该类型可以从指定类型中排除泛型属性never
。为了实现这一点,我使用了Omit
和条件类型。例如,当通用参数设置为number
它的行为符合预期,但是当泛型类型设置为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: "something, something"
};
//obj2 is never
const obj2: Excluded<never> = {
prop1: "dark side" //error: Type 'string' is not assignable to type 'never'
};
为什么要这样做以及如何让它返回正确的类型({ prop1: string }
)?
EDIT:相比于null
代替never
解决了这个问题。我仍然想知道我使用时发生了什么never
.
条件类型分布在裸类型参数上。这意味着条件类型将应用于联合的每个成员。never
被视为空联盟。因此,条件类型永远不会被应用(因为联合中没有成员可以应用它),从而导致never
type.
简单的解决方案是使用元组禁用条件类型的分配行为:
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"
};
游乐场链接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)