Type-challehges learning: pick

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,即返回类型是联合类型。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值