typescript 类型体操 之 3057-easy-push

278 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

前言

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

下面这个是类型体操github仓库:

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

3057-easy-push

我们首先还是先通过题目的README来看一下题目的要求

image.png

import type { Equal, Expect } from "@type-challenges/utils";
import { ExpectFalse, NotEqual } from "@type-challenges/utils";

type cases = [
  Expect<Equal<Push<[], 1>, [1]>>,
  Expect<Equal<Push<[1, 2], "3">, [1, 2, "3"]>>,
  Expect<Equal<Push<["1", 2, "3"], boolean>, ["1", 2, "3", boolean]>>
];

结合题目给的README和测试case,我们就能够得出,题目是需要我们实现一个函数,能够像一个数组中加入另一个参数,也就是在类型系统中实现 js 数组的 push 方法

利用js进行对比学习

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

我们用数组来进行模拟,新建一个 JSIf 函数,这个函数传入三个参数,第一个参数是一个布尔值,用于判断返回T或者F。

// js
function JSPush(T,U){
    return [...T,U]
}

image.png

虽然数组中自带了 push 方法,但是我们能尽量能够使用扩展运算符来实现,因为在 typescript 中,我们也能够使用扩展运算符。

实现 Push

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

为什么今天要跳过前一题来实现这个Push,因为今天这道题和昨天的解法是完全一样的,也是运用了 typescript 中的扩展运算符,我们可以将其中第一个数组参数扩展,然后放入第二个参数,组成一个新数组,和上面的 js 的解法完全是一模一样的逻辑。

type Push<T extends any[], U> = [...T,U];

这样子我们的测试用例就全部都通过了。

今天就稍微介绍一下 Rest 运算符,在

TypeScript 2.1 增加了对 对象扩展运算和 rest 属性提案的支持,该提案在 ES2018 中标准化。可以以类型安全的方式使用 rest 和 spread 属性。

我们可以通过解构赋值去获取到一个对象中的数据,并且 typescript 会给出正确的类型推导:

image.png

并且可以使用 ... 来吧剩余的元素都收集到一个对象当中,typescript 也会给出正确的类型推断

image.png

并且对于数组来说,扩展运算符 和 解构赋值的使用也是完全一样的。

image.png

在扩展运算符中,最需要注意的就是顺序,顺序决定了我们会怎么样得到数据或者数据会怎么样合并到一起

知识点

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

  1. ... Rest 操作符

Rset 操作符 昨天已经提过了,今天就不做过多的介绍,对于一个知识点,可以在短时间内当成一个集体一起完成,这样才能加深印象,并且要不断地去了解它的一些细节部分。

proposal-object-rest-spread

总结

今天这道题的知识点比较简单,和昨天是完全一样的知识点,同样知识点的题目就都放在一起解决,方便对于这个知识点的一个理解和记忆。