Typescript类型推导问题归总
文档说明
本文档收录了在编码实践中遇到的TS类型推导问题与解决方案。
问题1: 联合类型(Union Type)在进行条件类型(Conditional Type)的类型推导时会出现类型拆分(见bug-2137)。
- 问题描述:对于任意的联合类型
U = A | B | ...
,在进入条件表达式时都会分配到具体的A | B | ...
类型上,例如Promise<U>
经过条件表达式之后会被解析成Promise<A> | Promise<B> | ...
,而不会保留Promise<U>
,这样在我们需要显式定义Promise<U>
时就会发生推导错误。 - 原理分析:Typescript编译器在条件表达式的类型推导时会对联合类型进行拆分,具体行为如下:
// 定义一个联合类型 type U = string | boolean // 定义一个条件类型 type Promised<T> = T extends Promise<any> ? T : Promise<T> // 定义目标类型 type G = Promised<U> // 类型推导结果为:type G = Promise<string> | Promise<false> | Promise<true>
- 解决方案:采用元组的语法来告诉编译器不要对联合类型进行拆分:
// 定义一个条件类型 type Promised<T> = [T] extends [Promise<any>] ? T : Promise<T> // 定义目标类型 type G = Promised<U> // 类型推导结果为:type G = Promise<U>
- 扩展阅读:
- 针对该问题的官方文档描述将其定义为条件类型的一种正确行为
- 与bug-2137最相关的是针对boolean被拆分成true | false的讨论
- 而TS这种行为的来源是两次bug fix,分别是