类型操作符

typeof

获取一个标识符(变量/属性等)的类型,详见Typeof Type Operatoropen in new window

keyof 索引查询

Keyof Type Operatoropen in new window

keyof操作符将获取对象类型所有的属性,产生一个由字符串(数字)字面量类型组成的联合类型。

注意,

  • keyof只能获取public的属性,而不能获取到privateprotected的属性。

keyof any

// type T = string | number | symbol
type T = keyof any
1
2

keyof any的结果是string | number | symbol,原因是任何类型的key的类型只能为string | number | symbol

extends

条件判断,类似于三元运算符。当extends前面的条件满足,返回问号后的第一个参数,否则返回第二个参数。

/**
 * @example
 * type A1 = 1
 */
type A1 = 'x' extends 'x' ? 1 : 2;

/**
 * @example
 * type A2 = 2
 */
type A2 = 'x' | 'y' extends 'x' ? 1 : 2;

/**
 * @example
 * type A3 = 1 | 2
 */
type P<T> = T extends 'x' ? 1 : 2;
type A3 = P<'x' | 'y'>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

为什么 A2 和 A3 的值不一样?

  • 如果用于简单的条件判断,则是直接判断前面的类型是否可分配给后面的类型
  • extends前面的类型是泛型,且泛型传入的是联合类型时,则会依次判断该联合类型的所有子类型是否可分配给extends后面的类型(是一个分发的过程)。

总结,就是extends前面的参数为联合类型时则会分解(依次遍历所有的子类型进行条件判断)联合类型进行判断。然后将最终的结果组成新的联合类型。

如果不想被分解(即阻止extends关键词对于联合类型的分发特性),做法也很简单,可以通过简单的元组类型包裹一下:

type P<T> = [T] extends ['x'] ? 1 : 2;
/**
 * type A4 = 2;
 */
type A4 = P<'x' | 'y'>
1
2
3
4
5

infer

操作符