映射类型

映射类型的主要作用是基于键名映射到键值类型。

type Stringify<T> = {
  [K in keyof T]: string;
};

这个工具类型会接受一个对象类型(假设我们只会这么用),使用 keyof 获得这个对象类型的键名组成字面量联合类型,然后通过映射类型(即这里的 in 关键字)将这个联合类型的每一个成员映射出来,并将其键值类型设置为 string。

interface Foo {
  prop1: string;
  prop2: number;
  prop3: boolean;
  prop4: () => void;
}

type StringifiedFoo = Stringify<Foo>;

上述代码等价于

interface StringifiedFoo {
  prop1: string;
  prop2: string;
  prop3: string;
  prop4: string;
}

当然,既然我们可以拿到键,也就可以拿到对应的键值类型。

type Clone<T> = {
  [K in keyof T]: T[K];
};

这个类型其实就包括了前面的一些类型知识。其中 K in 属于映射类型的语法,keyof T 属于 keyof 操作符,[K in keyof T][] 属于索引签名类型,T[K] 属于索引类型访问。