1 为什么要学TS
TS是JS的超集,用于解决大型项目的代码复杂性。相比于JS,TS是强类型且静动态都支持、可以在编译期间发现并纠正错误、不允许改变变量的数据类型。
2 TS基础
2.1 基础类型
- boolean、number(整数、浮点数、负数)、string
number保持了JS原有的灵活性,又能在类型上对JS作一定扩展
- 枚举enum
TS特有,通过枚举对一些枚举值做一些类型定义,常见:数字、枚举。会把这些枚举值进行数据的映射,还包含一些常量异构的枚举值
- any、unknown、void
unknown是any的一个替代类型学,只允许被赋值
- never
永远不存在值的类型
- 数组类型[]
- 元组类型tuple
数组的一个特殊的形式,需要显式的去标注数组里每一个元素的类型
2.2 函数类型
定义
TS定义函数类型时要定义输入参数类型和输出类型
输入参数
参数支持可选参数和默认参数
输出参数
输出可以自动推断,没有返回值时,默认为void类型
函数重载
名称相同但参数不同,可以通过重载支持多种类型
2.3 interface
定义
接口是为了定义对象类型
特点
- 可选属性:?
- 只读属性:readonly
- 可以描述函数类型
总结
接口非常灵活 duck typing
2.4 类
定义
写法和JS差不多,增加了一些定义
特点
- 增加了public、private、protected修饰符(用法类似C++)
- 抽象类:
-
- 只能被基础,不能被实例化
-
- 作为基类,抽象方法必须被子类实现
- 若想用interface约束类,使用implements关键字
3 TS进阶
3.1 高级类型
- 联合类型 | :一个类型定义上可能存在多个基础类型
- 交叉类型 & :相关属性扩展,取并集
同名类型会取交集,同名非基础类型的合并会进行相关元素的组合关系
- 类型断言
- 类型别名(type VS interface)
- 定义:给类型取个别名
- 相同:
- 都可以定义对象或函数
- 都允许继承
- 差异点:
| 定义 | 定义基本类型 | 合并重复声明 | |
|---|---|---|---|
| interface | 对象 | 可以 | 可以 |
| type | 别名 | 不行 | 不行 |
3.2 泛型
3.2.1 什么时候需要泛型?
用泛型创建可重用的组件,一个组件可以支持多种类型的数据,用户可以以自己的数据类型来使用组件,提高了代码的可重用性,增加灵活度。
3.2.2 基本使用
基本定义
- 语法:<>里面写类型参数,一般用T表示
- 使用时有两种方法指定类型
- 1,定义要使用的类型
- 2,通过TS类型推断,自动推导类型
- 泛型的作用是临时占位,之后通过传来的类型进行推导
3.3.3 基础操作符
- typeof:获取类型
- keyof:获取所有键
- in:遍历枚举类型
- T[K]:索引访问
- extends:泛型约束
3.3.4 常用工具类型
将类型属性变为:
- Partial<T>:可选
- Required<T>:必选
- Readonly<T>:只读
- Pick、Record...
4 实战&工程向
4.1 声明文件
- decla
- .d.ts
- @types
- tsconfig.json
4.2 泛型约束后端接口类型
- 案例1:路径错误
- 案例2:参数错误
5个人感想和总结
TS和JS有不少不同点,而且语言写法在其他我学过的语言里有些是不常见的,进行了相关知识方面的拓展