type-challenges/README.zh-CN.md at main · TIMPICKLE/type-challenges · GitHub
最近真的是迷上了type-challenges。无法自拔 TS真是太香了!
今天手写一个pick
从类型定义的属性中,选取指定一组属性,返回一个新的类型定义。
type Pick<T, 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,即返回类型是联合类型。