一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情。
前言
在学习typescript的过程当中,有一个github库对其类型的学习特别有帮助,是一个有点类似于leetcode的刷题项目,能够在里面刷各种关于typescript类型的题目,本片文章带大家做其中简单难度的第八道题 533-easy-concat
下面这个是类型体操github仓库:
533-easy-concat
我们首先还是先通过题目的README来看一下题目的要求
import type { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Concat<[], []>, []>>,
Expect<Equal<Concat<[], [1]>, [1]>>,
Expect<Equal<Concat<[1, 2], [3, 4]>, [1, 2, 3, 4]>>,
Expect<Equal<Concat<['1', 2, '3'], [false, boolean, '4']>, ['1', 2, '3', false, boolean, '4']>>,
]
结合题目给的README和测试case,我们就能够得出,题目是需要我们实现一个函数,能够将两个数组何为一个数组,并且数组中的参数要保证是从左往右依次排列的。
利用js进行对比学习
首先我们还是先用js来模拟题目的要求。
我们用数组来进行模拟,新建一个 JSIf 函数,这个函数传入三个参数,第一个参数是一个布尔值,用于判断返回T或者F。
// js
function JSConcat(T,U){
return [...T,...U]
}
利用数组的扩展运算符,我们能够很轻松的拿出两个数组的value放入一个数组当中。
实现 Concat
接着我们就按照js的逻辑来实现ts的代码
在之前的题目中我们有提到过关于TS中的扩展运算符: typescript 类型体操 之 14-easy-first - 掘金 (juejin.cn)
但是我们并没有用太多的篇幅去做一个介绍,毕竟那时候只是作为那道题的一个提高解答,今天就稍微进行一个介绍,在类型当中,也有类似于 JS 扩展运算符的语法。
我们可以用它去获取一个数组中所有的value,注意,使用的对象一定只能是一个数组,不然就会报错
并且我们可以结合infer关键字,infer关键字可以简单理解为js中的定义变量,这样我们就可以对一个数组做一个扩展运算
要注意infer关键字定义的变量只能用在 true 分支当中
那么在知道了 typescript 中也存在着 扩展运算符 之后,这道题就变得很简单了,我们只需要对输入的两个数组做一个简单的合并处理。
当然输入的泛型必须是一个数组,那么我们可以用 extends 来对它进行约束
type Concat<T extends any[], U extends any[]> = [...T, ...U];
这里使用 any 或者 unknow 都是可以的,至于他们两个的区别,我们之后会再来细说。
这样子我们的测试用例就全部都通过了。
知识点
关于上述提到了部分的知识点:
- ... Rest 操作符
- infer关键字
关于 Rest 操作符可以看一下一个github项目中的介绍,至于infer关键字再之后有真正使用到,我们再来做一个介绍。
总结
今天这道题的知识点比较简单,实现起来的难度应该特别小,稍微知道一下扩展运算符的基本语法应该就是没有问题的,但是可以更多的去了解 Rest 操作符 在 typescript 中的一个实际操作需要注意的事项。