TypeScript 入门 | 青训营笔记

69 阅读3分钟

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

本堂课重点内容

  • TypeScript的优势
  • TypeScript的基础语法
  • TypeScript高级类型

TypeScript的优势

  • 可读性增强:基于语法解析TSDoc,ide增强
  • 可维护性增强:在编译阶段暴露大部分错误
  • 包含于兼容所有JS特性,支持共存
  • 支持渐进式引入与升级

TypeScript的基础语法

  • TypeScript的基础数据类型

在TypeScript中定义数据类型相比于JavaScript有一些区别,TypeScript是在变量名后加一个冒号(:),后接类型的名称。

JavaScript(左)、TypeScript(右)

image.png

  • TypeScript的对象类型

在TypeScript的编写约定中,一般来说会用一个大写的I开头来表示这是一个类型,和普通的类或者对象进行一个区分。在TypeScript中用interface关键字来定义一个类型。在key的前面通过关键字readonly可以声明这是一个只读属性,只读属性不可以在对象初始化外赋值;可选属性则是在冒号前加一个问号表示可选属性,表示可以存在也可以不存在;任意属性则是加一个[]表示任意属性。在TypeScript中有一个特殊类型:any,表示任意、任何。

image.png

image.png

  • TypeScript的函数类型

在TypeScript中为函数声明类型有两种方式,一种是直接在函数的声明上进行一个类型的补充,还有一种是给函数变量赋值一个函数类型的声明。

image.png

image.png

  • TypeScript的数组类型

在TypeScript中定义数组通常有四种方式,一般用前两种来定义。

image.png

TypeScript高级类型

  • 联合/交叉类型

比如说编写书籍列表,在普通的编写中是通过两种类型来进行区分,例如type:'history'type:'story',这样编写类型声明繁琐,存在较多重复。比如author这个类型重复写了一遍,另外type这个类型的描述不准确,在bookListtype只能取值两种,historystory,而这个地方写了String,这些地方都会对我们后面的编码造成一些麻烦、隐患。

image.png

我们可以这样来改进(左:改进前,右:联合/交叉类型)

联合类型:|A | |B;联合类型表示一个值可以是几种类型之一。

交叉类型:|A & |B;多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。

不管是history还是story都存在作者:author这样一个属性,就可以定义它为公共的对象子集,只需要写一次;公共的会和不公共的做一个合集,所以可以用到交叉类型。

image.png

  • 类型保护与类型守卫

当我们使用联合类型的时候,要消费一个联合类型的key或者是一个方法的时候,只能消费两个类型联合起来的公共部分,也就是交集。

image.png

所以我们可以通过类型守卫的方式来进行改造,原理就是额外定义了一个getIsIA这样一个函数,它同样接收一个参数,这个参数可以是IA或IB。

image.png

或者采用更加智能的写法:

image.png

本文若有不足之处,欢迎纠正!😊