TypeScript2 | 青训营笔记

57 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第4天

高级类型

1.联合/交叉类型

image.png 在这里author是公共属性而后面两个用|标起来的是二选一的联合类型的属性

2.类型保护与类型守卫

image.png 访问联合类型时,处于程序安全,仅能访问联合类型中的交集部分

image.png

!!(a)的作用是将a强制转换为布尔型(boolean)

这里使用了断言的属性,先告诉编译器arguments是IA(也就是假定他是IA),再调用a属性,如果他真的是IA那么返回值就是true,那么arg is IA这个代码就告诉编译器这个arguments真的是IA,相当于上一个过程的简化。

但并不是所有情况下我们都需要写很多的类型守卫,只有在两个类型没有任何共同点时,我们才需要去写类型守卫。typescript是内置了一些智能的,可以自动识别类型的函数的~ 还有nstanceoftypeof

image.png

应用

1.merge函数的两种实现方法

image.png

image.png

但这种实现方法存在很大弊端:类型实现比较繁琐,如果对象类型复杂的话,我们的source和target两个类型的声明就会出现大量重复代码,需要重复写两遍,使用起来也容易出错,如果target增加或者减少key,source需要联动,但实际上我们并不能知道使用这个函数的人传入的到底是具有何种属性的object,所以我们需要用一些高级类型去改进这个merge函数

image.png 也就是说,在类型定义的时候是不明确的,在使用的时候才明确,我们可以用到泛型这样一个概念。定义了一个泛型T,并用extends对T进行限定,在函数内部使用泛型变量的时候,由于事先不知道它是哪种类型,所以不能随意的操作它的属性或方法,我们要限定传入的参数要是object类型,这里的record就是一个高级类型,这个高级类型中的第一个泛型是key的类型,第二个是value的类型,也就是说record<string,any>any object的一个简单表达。

下方注释中解释了关键字keyof和关键字in的含义和用法,即用一种比较优雅的方式体现出来sourceObjtargetObj的子集。

由于应用广泛,Partial目前已经是ts的内置类型了

2.函数返回值类型