「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」
前言
在学习typescript的过程当中,有一个github库对其类型的学习特别有帮助,是一个有点类似于leetcode的刷题项目,能够在里面刷各种关于typescript类型的题目,本片文章带大家做其中简单难度的第一道题4-easy-pick
4-easy-pick
首先我们先来阅读一下 README,题目要求我们实现 ts 内置的 Pick<T, K> 函数,相当于说是让我们自定义一个 MyPick<T, K> 实现和 Pick<T, K> 一样的功能。可以看底下提供的例子, MyPick<T, K> 函数要能够实现从一个接口中选出我们所需要的类型,形成一个新的接口
利用js进行对比学习
直接用ts实现上述功能可能会无从下手,但是我们可以用我们熟悉的js代码,来先模拟一下题目的要求。
题目需要实现一个函数,这个函数会传入一个对象(利用对象模拟接口,因为js没有接口的概念),在这个对象中有着一些属性,然后这个函数还会传入一个数组,这个数组当中保存着一些属性。
接着我们要将这个对象进行一个过滤,生成一个新的对象,这个新的对象只有数组中所包含的属性,没有其他的属性。
并且这样并不完美,万一传入的数组中有着原来对象中所没有的属性那要怎么办,所以我还需要加一层校验,遍历数组的过程中,只有这个属性存在于传入的对象中,才会对其进行赋值。
function myPick(todo, keys){
const TodoPreview = new Object();
for(let key in keys){
if(key in todo){
TodoPreview[key] = todo[key]
}
}
return TodoPreview
}
实现MyPick
接着我们就按照js的逻辑来实现ts的接口代码
-
我们需要去遍历传进来的keys,根据测试中的测试代码,我们能发现传进来的keys是一个联合类型,我们需要用 [P in K] 这种方式来遍历我们的联合类型。
-
接着需要将遍历到的值付给传进来的 T 也就是新接口,综合上面我们可以用一行代码实现这两个功能:
但是这时候就会发现代码报错:
这就是上述说到的那个问题,P类型可能T中本来是没有的,在ts当中就会直接报错,所以接下去我们要添加限制。
- 关于约束,我们可以使用extends关键字来对其进行一个约束,所以可以在 K 后面添加约束:
但是这个时候还是会报错,这时候我们看测试中的todo和传入的K就会发现,他们两的类型并不相同,所以我们还需要通过keyof关键字,将todo转为联合类型。
这样我们的代码就不会再报错,并且测试那边的代码也都能够通过,这样我们就算是完成这道题了
知识点
关于上述提到了部分的知识点:
- 联合类型的遍历
- extends关键字
- keyof关键字 关于这些知识点,大家可以去官网查看相关文档,也可以看我看的掘金上阿宝哥的ts文章:
总结
今天热身解决了第一道题目,在之后的时间中也会慢慢去更新剩下的题目,一起学习ts。