本篇介绍TS另一种高级类型-条件类型。
官方文档:https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types
1、条件类型是一种由条件表达式所决定的类型
2、条件类型使类型具有了不唯一性,同样增加了语言的灵活性
例如:
T extends U ? X : Y
若类型T可被赋值给类型U,那么结果类型就是X类型,否则就是Y类型。
条件类型约束
泛型约束的例子:
type MessageOf<T extends { message: unknown }> = T["message"];
在此示例中,我们使用 message: unknown 约束泛型T。
如果我们想 MessageOf 支持任何类型,我们可以通过将约束和条件类型一起使用:
type MessageOf<T> = T extends { message: unknown } ? T["message"] : never;
如果条件成立,在 true 分支内,TypeScript 知道 T 将具有一个 message 属性。否则将会返回 never 类型。
分布条件类型
当条件类型给定联合类型时,它们将变为分布式。
type ToArray<Type> = Type extends any ? Type[] : never;
如果我们将联合类型传入ToArray,则条件类型将应用于该联合的每个成员。
type ToArray<Type> = Type extends any ? Type[] : never;
type StrArrOrNumArr = ToArray<string | number>;
StrArrOrNumArr 类型是 string[] | number[]
避免这种分配性的行为。可以用方括号将 extends 关键字的每一侧括起来。
type ToArrayNonDist<Type> = [Type] extends [any] ? Type[] : never;
type StrOrNumArr = ToArrayNonDist<string | number>;
StrArrOrNumArr 类型是 (string | number)[]