面试题答案
一键面试type SelectivePick<T, K extends keyof T> = {
[P in K as T[P] extends string ? P : never]: T[P];
};
泛型推导、条件类型与映射类型协同工作说明
- 映射类型:
[P in K as T[P] extends string ? P : never]: T[P];
这部分是一个映射类型。P in K
表示遍历联合类型K
中的每一个属性名。对于K
中的每一个属性名P
,我们将在新类型中创建一个对应的属性。
- 条件类型:
as T[P] extends string ? P : never
这是一个条件类型。它会检查T
类型中属性P
的类型是否为string
。如果是,则保留属性名P
,否则使用never
。这确保了我们只选择类型为string
的属性。如果属性P
的类型不是string
,never
会使得该属性不会出现在最终的类型中。
- 泛型推导:
T
是一个泛型类型参数,它代表任意一个对象类型。K
是另一个泛型类型参数,它必须是T
的键的联合类型(K extends keyof T
)。通过这种方式,我们确保K
中的属性名确实存在于T
中。在整个类型工具的实现过程中,T
和K
被泛型推导,根据传入的具体类型实参来生成相应的新类型。比如传入Example
和Keys
,就会生成{ name: string; address: string }
类型。