Pick<Type, Keys>返回一个新的对象类型,第一个参数Type是一个对象类型,第二个参数KeysType里面被选定的键名。

interface A {
  x: number;
  y: number;
}
type T1 = Pick<A, "x">; // { x: number }
type T2 = Pick<A, "y">; // { y: number }
type T3 = Pick<A, "x" | "y">; // { x: number; y: number }

上面示例中,Pick<Type, Keys>会从对象类型A里面挑出指定的键名,组成一个新的对象类型。 指定的键名Keys必须是对象键名Type里面已经存在的键名,否则会报错。

interface A {
  x: number;
  y: number;
}
type T = Pick<A, "z">; // 报错

上面示例中,对象类型A不存在键名z,所以报错了。 Pick<Type, Keys>的实现如下。

type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};