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
相关产品推荐
相关产品推荐

