You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript内置工具类型Pick<Type, Keys>工作原理及泛型约束疑问

详解TypeScript内置工具类型Pick<Type, Keys>的工作原理

Pick的核心实现

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

示例场景

先定义一个Todo接口:

interface Todo {
    title: string
    description: string
    completed: boolean
}

用Pick创建只包含title字段的类型:

const obj: Pick<Todo, "title"> = {
    title: "Hello",
}

核心疑问解答

1. 为什么要让K extends keyof T?

这是类型约束,目的是确保你传入的K只能是T已有键的子集。比如你如果写Pick<Todo, "invalidKey">,TypeScript会直接报错——因为"invalidKey"不在keyof Todo(即"title"|"description"|"completed")的范围内,这能有效避免传入不存在的键,保证类型安全。

2. 为什么[P in K]不会变成[P in "title"|"description"|"completed"]?

你误解了K的实际类型。当你使用Pick<Todo, "title">时,K的类型就是"title",而非整个keyof Todo。K extends keyof T只是限制你传入的K必须是keyof T的子集,不是让K等于keyof T。比如你传"title"|"completed",那K就是这个联合类型,[P in K]就会遍历这两个键生成对应字段。

3. 为什么不能直接用[P in keyof T]?

如果直接写[P in keyof T],这个类型就和原类型T完全一致了,相当于复制了整个Todo的结构,完全失去了Pick工具“挑选指定字段生成新类型”的核心作用。Pick的意义就是让你能从原类型中选择部分字段,而非全部。

内容的提问来源于stack exchange,提问作者Egor Postnov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:10:33