type-challenges/README.zh-CN.md at main · TIMPICKLE/type-challenges · GitHub
最近真的是迷上了type-challenges。无法自拔 TS真是太香了!
今天手写一个pick
从类型定义的属性中,选取指定一组属性,返回一个新的类型定义。
- type Pick
, K extends keyof T> = { - [P in K]: T[P];
- };
首先使用JS来实现一遍来体现其思想
- // 我们用function来模拟类型工具,用对象来模拟类型本身
- function MyPick(obj, keys) {
- //第一步 创建一个新的类型
- const result = {}
-
- //第二步 遍历keys,将todo里面的每一个key和值都copy给obj
- keys.forEach((key) => {
- // 注意 key可能不在原来的todo里面,所以要进行判断
- if(key in obj){
- result[key] = obj[key]
- }
- })
-
- //第三步 返回
- return result
- }
- 返回一个类型
- 遍历一个联合类型( union type )
- 取值( result[key] )
- 判断一个成员是否在类型中( if (key in obj) )
- interface Person {
- name: string;
- age: number;
- id: number;
- sex: 0 | 1;
- }
-
- // 问女生年纪不太礼貌,所以我们不需要 age 这个属性
- type Woman = Pick<Person, "name" | "id">;
-
- // 此时 Woman 等效于 Female
-
- interface Female {
- name: string;
- id: number;
- }
tips:在JS中我们操作的是对象,在TS中我们操作的类型
ts的映射类型语法:

自己实现TS的pick

keyof T 用于获取所有key,即返回类型是联合类型。