typescript 类型体操 之 4-easy-pick

507 阅读3分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

前言

在学习typescript的过程当中,有一个github库对其类型的学习特别有帮助,是一个有点类似于leetcode的刷题项目,能够在里面刷各种关于typescript类型的题目,本片文章带大家做其中简单难度的第一道题4-easy-pick

type-challenges/type-challenges: Collection of TypeScript type challenges with online judge (github.com)

4-easy-pick

首先我们先来阅读一下 README,题目要求我们实现 ts 内置的 Pick<T, K> 函数,相当于说是让我们自定义一个 MyPick<T, K> 实现和 Pick<T, K> 一样的功能。可以看底下提供的例子, MyPick<T, K> 函数要能够实现从一个接口中选出我们所需要的类型,形成一个新的接口 image.png

利用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的接口代码

  1. 我们需要去遍历传进来的keys,根据测试中的测试代码,我们能发现传进来的keys是一个联合类型,我们需要用 [P in K] 这种方式来遍历我们的联合类型。

  2. 接着需要将遍历到的值付给传进来的 T 也就是新接口,综合上面我们可以用一行代码实现这两个功能: image.png 但是这时候就会发现代码报错:

image.png 这就是上述说到的那个问题,P类型可能T中本来是没有的,在ts当中就会直接报错,所以接下去我们要添加限制。

  1. 关于约束,我们可以使用extends关键字来对其进行一个约束,所以可以在 K 后面添加约束:

image.png

但是这个时候还是会报错,这时候我们看测试中的todo和传入的K就会发现,他们两的类型并不相同,所以我们还需要通过keyof关键字,将todo转为联合类型。

image.png 这样我们的代码就不会再报错,并且测试那边的代码也都能够通过,这样我们就算是完成这道题了

知识点

关于上述提到了部分的知识点:

  1. 联合类型的遍历
  2. extends关键字
  3. keyof关键字 关于这些知识点,大家可以去官网查看相关文档,也可以看我看的掘金上阿宝哥的ts文章:

一份不可多得的 TS 学习指南(1.8W字) - 掘金 (juejin.cn)

总结

今天热身解决了第一道题目,在之后的时间中也会慢慢去更新剩下的题目,一起学习ts。