打字稿从不输入条件

nro*_*fis 9 typescript

我想创建一个带有基于条件的类型,never但结果是意外的(Typescript 版本 4.1.3)。

type TypeCond<T, U> = T extends never ? {a: U} : {b: U};

let test: TypeCond<never, number>;
Run Code Online (Sandbox Code Playgroud)

我有TypeCond一个简单的条件 if Textends never

我期望test变量的类型是{a: number},但实际上,类型是never.

我不知道为什么......如果我替换neverundefined或者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};
Run Code Online (Sandbox Code Playgroud)

这避免了条件类型分布在 上T,因为[T]不是“裸类型参数”。

  • 很好的解释。它被开发人员称为[“空联合”](https://github.com/microsoft/TypeScript/issues/23182#issuecomment-379094672)。 (2认同)