Typescript从不输入条件
我想创建一个类型,其条件基于never,但结果是意外的Typescript版本4.1.3Typescript从不输入条件,typescript,Typescript,我想创建一个类型,其条件基于never,但结果是意外的Typescript版本4.1.3 type TypeCond<T, U> = T extends never ? {a: U} : {b: U}; let test: TypeCond<never, number>; 我有一个TypeCond,它有一个简单的条件,如果T从不扩展 我希望测试变量的类型是{a:number},但实际上,该类型永远不会是 我不知道为什么。。。如果我用undefined或null替换ne
type TypeCond<T, U> = T extends never ? {a: U} : {b: U};
let test: TypeCond<never, number>;
我有一个TypeCond,它有一个简单的条件,如果T从不扩展
我希望测试变量的类型是{a:number},但实际上,该类型永远不会是
我不知道为什么。。。如果我用undefined或null替换never,它将按预期工作。但我需要“从不”类型的条件
知道为什么测试得到的是从不类型而不是{a:number}吗?我相信这是in-Typescript的结果。本质上,S|T扩展了A?B:C等于S和A?B:C | T扩展A?B:C,即条件类型分布在extends子句中的并集上。由于每种类型的T都等价于T | never,因此 T扩展A?B:C等于T |从不扩展A?B:C, 这又相当于T扩展了A?B:C |从不扩展A?B:C, 这与使用“从不扩展”联合的原始类型相同?B:C。 所以一个条件类型的表单永远不会扩展?B:C必须求值为“永不”,否则将违反分配属性 要使您的类型按预期工作,您可以使用以下技巧:
type TypeCond<T, U> = [T] extends [never] ? {a: U} : {b: U};
这避免了条件类型分布在T上,因为[T]不是裸类型参数。我相信这是in-Typescript的结果。本质上,S|T扩展了A?B:C等于S和A?B:C | T扩展A?B:C,即条件类型分布在extends子句中的并集上。由于每种类型的T都等价于T | never,因此 T扩展A?B:C等于T |从不扩展A?B:C, 这又相当于T扩展了A?B:C |从不扩展A?B:C, 这与使用“从不扩展”联合的原始类型相同?B:C。 所以一个条件类型的表单永远不会扩展?B:C必须求值为“永不”,否则将违反分配属性 要使您的类型按预期工作,您可以使用以下技巧:
type TypeCond<T, U> = [T] extends [never] ? {a: U} : {b: U};
这避免了条件类型分布在T上,因为[T]不是裸类型参数。很好的解释。它是由开发者调用的。很好的解释。它由开发人员调用。相关:相关: