实用程序类型Pick<T, K>是为了解决从现有类型或接口选择性复制部分字段的问题而添加到TypeScript中的。
在开发过程中,经常会重复使用带有轻微变化的数据结构。在出现Pick之前,开发者不得不手动复制所需字段来创建新的接口,这造成了代码重复和在后续修改原始结构时的错误。
需要对函数的输入或输出数据进行类型化,仅使用大型接口中的部分字段,以避免冗余,并最大限度地具体化契约。
Pick解决了根据键K提取类型T的属性子集的问题:
type Pick<T, K extends keyof T> = { [P in K]: T[P] };
示例:
interface User { id: number; name: string; email: string; } type Credentials = Pick<User, 'email' | 'name'>; const creds: Credentials = { email: "user@example.com", name: "User Name", };
关键特性:
Pick与Omit有什么区别?
Pick仅选择指定的类型字段;Omit则相反,从结构中排除它们。
type PartialUser = Omit<User, 'id'>; // 除id外的所有字段
可以通过Pick选择不存在的属性吗?
不可以,K键必须是原始类型的键,否则会导致编译错误。
Pick可以影响可选性或readonly字段吗?
如果原始类型中有修饰符(optional,readonly),Pick会保留这些修饰符,仅将它们复制到新的类型中。
在处理数据输入表单时,开发者手动描述了自己的类型,遗忘了User中新增的强制属性。在更新接口后,表单崩溃了。
优点:
缺点:
使用Pick提取所需表单字段:
type FormFields = Pick<User, 'email' | 'name'>;
User中的更改会自动反映在表单中。
优点:
缺点: