这是我参与[第五届青训营]笔记创作活动的第4天
课堂笔记
本堂课重点内容
- TypeScript学习背景介绍
- TypeScript基础语法与高级类型
- TypeScript工程应用
具体内容
TypeScript 主要使用的工具
TypeScript 是 JavaScript 的语法超集,它添加了静态类型,近几年的发展中,也受到诸多开发者的喜爱。
TypeScript 与 JavaScript 的主要区别是一个是静态类型,一个是动态类型。基于此它的优势有:
- 可读性增强:基于语法解析TSDoc,ide增强
- 可维护性增强:在编译阶段暴露大部分错误
所以可以在多人合作的大项目中,获得更好的稳定性和开发效率。
TypeScript的功能特点是JS的超集,包含于兼容所有JS特性,支持共存,支持渐进式引入与升级。
基本语法:
[基础数据类型]:
用一个变量去定义类型的时候,就在变量名后加上冒号:再接上它类型的名称
[对象类型]:
创建一个bytedancer的对象,像基础数据类型一样用冒号紧跟一个类型来添加类型声明。这些类型基本上是内置的类型,大部分情况下是我们自定义的。在TS中我们一般一般用大写I开头表示这是一个类型,通过关键字interface来定义。
在对象中,我们经常可能会有一些特定的需要,eg:只读属性,可选属性,任意属性等。
[函数类型]:
给函数添加类型声明一般有两种方式:
- 直接在函数上进行一个类型的补充
- 给函数变量赋值一个类型声明
对于一个函数来说,它最重要的点其实是它的入参和出参,所有类型声明也是针对这个来补充的。
参数类型就在参数的冒号后,返回值的类型则在右括号冒号后:
这样的代码其实相当长,有时候对我们的代码不是很友好,所以,函数也支持利用interface来定义类型的。
[函数重载]:
[数组类型]: 数组其实是一个对象的扩展索引
TypeScript 高级数据类型
[联合/交叉类型]:
场景:存在一个书籍列表,有两种类型,不同类型是通过type进行区分。对其进行一个类型声明:
如上图,利用interface关键字定义后的代码比原先的代码还要多,存在较多的重复。
这样其实对代码存在一些隐患,改进方式:
- 联合类型:IA | IB;联合类型表示一个值可以是击中类型之一
- 交叉类型:IA & IB;多种类型叠加在一起成为一种类型,它包含了所需的所有类型的特性。
[类型保护与类型守卫]:
log函数中可以接收IA或者IB两种类型的参数,判断参数是a类型还是b类型:
这样在js中没问题,但是在ts中会报错。在ts中可以通过类型守卫的方式来进行改造:
[Merge 函数类型实现]: 将sourceObj与targetObj做合并。
[函数返回值类型]:
场景:函数delayCall接收一个函数作为入参,其实现延迟1s运行函数,返回promise,结果为入参函数的返回结果。如何为delayCall实现类型声明。
用泛型,并对泛型做限定: