Pick<T, K>
最后更新:2026-10-22
Pick<T, K> Pick
Pick<T, K> 从 T 中"挑出"K 指定的属性,组成一个新类型。当你只需要一个大类型的一小部分(列表摘要、子集参数)时,不用再手写重复类型——而且源类型改了字段类型,Pick 出来的会自动跟上。
| 分组 | 工具类型 |
|---|---|
| 类型 | 类型 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
// 用法
type OrderSummary = Pick<Order, "id" | "buyer" | "total">;
⚙️ 参数
| T | 源对象类型,属性从这里挑选 |
|---|---|
| K extends keyof T | 要保留的键的联合;必须是 T 已有的键,写错键名会编译报错(这是 Pick 的安全所在) |
返回值:一个新类型:只含 K 指定的属性,类型与 T 中对应属性一致。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
{"id":"A-1024","buyer":"Carol","total":259}
(转译后运行输出;若在 OrderSummary 上访问 order.address 会编译报错——Pick 白名单外的字段类型上不存在)
💡 要点
ℹ️ 说明 实现:type Pick<T, K extends keyof T> = { [P in K]: T[P] }——K 是键的联合,映射类型逐个取出对应属性类型。
⚠️ 注意 Pick 是白名单:之后给 Order 新增的字段不会自动出现在 Pick 结果里。如果你本意是"要全部但去掉某几个",应该用 Omit(黑名单),否则新字段会被悄悄漏掉。
💡 提示 经验法则:要的字段少用 Pick,要剔除的字段少用 Omit。两者都是浅层拷贝类型,嵌套对象引用仍共享。
🏷️ 相关工具类型
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q Pick 之后修改属性会影响原对象吗?
A Pick 只在类型层挑选属性,不拷贝数据。运行时对象怎么构造取决于你的代码(示例里 toSummary 用解构新建了对象);直接引用同一对象时修改当然互相可见。
Q Pick 里写了不存在的键会怎样?
A 编译报错:Type '"oderId"' is not assignable to type 'keyof Order'。K 约束为 keyof T,拼写错误当场暴露——这是 Pick 比 Omit 安全的地方(Omit 不做这个检查)。
Q Pick 能连方法一起挑吗?
A 可以。方法是属性的一种,Pick<T, "save"> 会得到 { save: () => void } 这样的类型,this 绑定与原类型一致,调用方式不变。