我想创建一个带有基于条件的类型,never但结果是意外的(Typescript 版本 4.1.3)。
type TypeCond<T, U> = T extends never ? {a: U} : {b: U};
let test: TypeCond<never, number>;
我有TypeCond一个简单的条件 if Textends never。
我期望test变量的类型是{a: number},但实际上,类型是never.
我不知道为什么......如果我替换never为undefined或者null它按预期工作。但我需要该类型的条件never。
知道为什么test要获取never类型而不是吗{a: number}?
kay*_*ya3 20
我相信这是 Typescript 中条件类型的分布式属性的结果。本质上,(S | T) extends A ? B : C相当于(S extends A ? B : C) | (T extends A ? B : C),即条件类型分布在子句中的并集上extends。由于每种类型T都等价于T | never,因此得出结论
T extends A ? B : C相当于(T | never) extends A ? B : C,(T extends A ? B : C) | (never extends A ? B : C),never extends A ? B : C。因此,形式的条件类型never extends A ? B : C 必须计算为never,否则将违反分配性。
为了使您的类型按预期工作,您可以使用以下技巧:
type TypeCond<T, U> = [T] extends [never] ? {a: U} : {b: U};
这避免了条件类型分布在 上T,因为[T]不是“裸类型参数”。
| 归档时间: | 
 | 
| 查看次数: | 3908 次 | 
| 最近记录: |