TypeScript 类型系统支持哪些类型和类型运算?

· 278 words · 2 min

TypeScript 类型系统中的一些类型运算。

条件运算

ts 为图灵类型完备的类型系统,具有类型计算功能。extends 相当于 js 中的三元运算符。

type isTwo<T> = T extends 2 ? true: false;

type res = isTwo<1>;
//   ^?
type res2 = isTwo<2>;
//   ^?

推导

infer 后面的泛型表示待推导的类型。

type First<Tuple extends unknown[]> = Tuple extends [infer T,...infer R] ? T : never;

type res = First<[1,2,3]>;
//   ^?

交叉

对两种类型取交集,没有交集则为 never

type ObjType = {a: number } & {c: boolean}; // { a: number; c: boolean }

type res = 'aaa' & 222;
//   ^?

类型映射

type MapType<T> = {
  [Key in keyof T]?: T[Key]
}

keyof T 是查询索引类型中所有的索引,叫做索引查询T[Key] 是取索引类型某个索引的值,叫做索引访问

一个集合映射到另一个集合,叫做类型映射。使用 as 运算符,可以做到重映射

type MapType<T> = {
    [Key in keyof T as `${Key & string}${Key & string}${Key & string}`]: [T[Key], T[Key], T[Key]]
}

Key 默认可能是 stringnumbersymbol 这三种,所以要和 string 取交叉部分。

From 掘金小册