这是我参与「第五届青训营」伴学笔记创作活动的第4天。
TypeScript
TS vs JS
相比于JS,TypeScript有以下优点:
静态类型
JS饱受诟病的一点便是弱变量类型,而TS是一门静态类型的语言。
- 可读性增强:基于语法解析TSDoc,IDE增强
- 可维护性增强:在编译阶段暴露大部分错误
因此,在多人合作的大型项目中,使用TS,可以获得更好的稳定性和开发效率。
JS的超集
- 包含于兼容所有JS特性,支持共存
- 支持渐进式引入与升级
从“JS的超集”这一特点来说,TS之于JS就好比C++之于C(当然,这好像是一种不太负责任的说法,C语言在一众编程语言中,具有举足轻重的地位)。
数据类型
基础数据类型
JS里的基础数据类型(ES6之前)有5种:string、number、boolean、null、undefined,TS也是如此。在使用let或者const声明变量时,可以给变量名后加:变量类型。
对象类型
可以使用鸭子类型(Duck Typing)对变量加以约束。
If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck.
这段话是「鸭子类型」的命名由来。先不论其在逻辑上的正确性,鸭子类型其实是「结构化类型」的一种十分形象的称呼,结构化地声明对象就变成一种类型「填鸭」的过程。
interface Duck {
name?: string;
sex: "male" | "female" | "other";
}
我们规定了一只「鸭子」该有的「美德」,于是能被称作「鸭子」的便应具有这种「美德」,否则其不配为「鸭子」。
函数类型
可以规定函数的参数类型和返回值类型。如:
const multiply: (x: number, Y: number) => number = (x, y) => x * y;
其中(x: number, Y: number) => number便是对函数类型的约束。
函数重载
对于不同的参数类型,可以返回不同类型的值。
注:各个重载方法(构造函数)的参数类型列表不能重复。
数组类型
数组有不同的表示方法:
- 类型+方括号表示
- 泛型表示
- 元组表示
- 接口表示
TypeScript补充类型
- 空类型
void,表示无赋值 - 任意类型
any,是所有类型的子类型 - 枚举类型
enum,支持枚举值到枚举名的正、反向映射 - 泛型
类型别名
使用type typeAlias typeSrc来为typeSrc设置一个别名typeAlias,类似于C语言里的typedef关键字。
类型断言
使用as关键字进行类型断言。
字符串/数字 字面量
它允许指定字符串/数字必须的固定值,如"A" | "B"或0 | 1。