typescript 类型体操 之 7-easy-readonly

271 阅读2分钟

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

前言

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

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

7-easy-readonly

首先我们先来阅读一下 README,题目要求我们实现 ts 内置的 Readonly<T> 函数,并且接收并返回一个完全一样的类型,不同的是这个类型的所有属性都会被 readonly 所修饰。

接下来来介绍一下 ts 内置的 readonly 的作用:

  1. 我们定义一个接口如果在接口的值前面加上readonly,那么这个值就无法被改变 image.png

image.png

所以接下去我们就要自己来实现一个这样的函数。

利用js进行对比学习

我们还是先用js来模拟题目的要求。

首先函数会传入一个对象,并且返回一个完全一样的对象,区别在于,我们需要在这个对象的每一个属性前面,添加上readonly关键字。

function readonly(todo1) {
  const MyReadonly = {};
  for (const key in todo1) {
    MyReadonly["readonly" + key] = todo1[key];
  }
  return MyReadonly;
}

实现MyReadonly

接着我们就按照js的逻辑来实现ts的接口代码

  1. 首先我们需要遍历传进来的接口的所有属性,这其中就要用到之前提到过的 [P in K] 的方式来进行一个遍历。

image.png

  1. 并且我们会发现遍历后会报错,报错的原因是传入的是一个接口,但是我们只能遍历联合类型,所有,我们还需要用keyof关键字将todo1转为联合类型。

image.png

  1. 接下来,我们就需要将里面的每一个属性都添加上 readonly 修饰符,在ts中添加修饰符只要在属性前面写上readonly就可以了。

image.png

这样我们测试的代码就不会报错错误警告了,这道题也就算是完成了。

知识点

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

  1. 联合类型的遍历
  2. keyof关键字
  3. readonly 修饰符 今天提到了新的知识点 readonly ,大家可以去官网查看 readonly 相应的介绍,这里下面放上官网链接,至于另外两个知识点,如果弄懂了上一道题,应该是完全不在话下的。

TypeScript: Documentation - Utility Types (typescriptlang.org)

总结

今天解决了第二道题,做完第一题之后再来做第二题应该是没有什么难度的,因为所用到的新知识点并不多,通过对比js的方法也能更好地理解这些题目。