◆
TypeScript Pick 提取多个属性的用法
接口里定义了十几个字段,但某个函数只用到其中两三个——这时候手写一个新接口把那几个字段抄过去,是最容易埋隐患的做法:原接口字段改了类型,抄出来的那份不会跟着变,TS 也不会报错提醒你。
Pick<T, K> 解决的就是这个问题。它从已有类型里挑出指定的几个属性组成新类型,属性的类型定义仍然跟着源接口走,源接口一改,派生出来的类型自动同步。常见用途是给表单、列表项、接口入参这些只需要部分字段的地方声明类型。
Pick
先看实现。Pick 是内置的映射类型,就三行:K extends keyof T 约束了只能挑源类型里真实存在的键,拼错一个字母就编译报错;[P in K] 遍历这批键,T[P] 取源类型上对应的类型。这个约束是它比手写接口安全的根本原因。
下面 Pick<Animal, 'canSwim'> 是单个属性的用法,得到的类型等价于 { canSwim: boolean }。
// 实现:通过从Type中抉择属性Keys的汇合来构造类型
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
// 用于提取接口的某几个属性
interface Animal {
canFly: boolean;
canSwim: boolean;
}
let person: Pick<Animal, 'canSwim'> = {
canSwim: true,
};
提取多个属性
要挑多个属性,第二个参数传字符串字面量的联合类型,用 | 连接——不是数组,也不是逗号分隔。这是最容易写错的地方。
ParamType 这里带了默认泛型参数 <T = string>,所以 Pick<ParamType, ...> 不写具体类型时,各字段就按 string 处理。取出来的 NewType 等价于 { projectCode: string; projectName: string }。
反过来「排除某几个属性」用 Omit<T, K>,参数形式一样。
export interface ParamType<T = string> {
projectName: T; //项目名称
projectCode: T; //项目code
trCode: T; //企业code
assetsType: T; // 基础资产
tradingMarket: T; // 流通市场
originalOwner: any[]; // 原始权益人/发起人
}
type NewType = Pick<ParamType, 'projectCode' | 'projectName'>;

还没有留言,来发表第一条吧~