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 绑定与原类型一致,调用方式不变。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏