Typescript 类型体操
愿你的努力被世界看到!
优先使用接口(interface
)定义对象结构,类型别名(type
)用于联合类型或复杂类型。
元组
在 py 中元组是固定类型,固定长度的,但是在 ts 中只固定了类型,仍然通过 push
等方法来改变(设计如此)。
1 | let t:[number, string] = [1, 'content']; |
ts 4.0 新增加了命名元组,可以增强代码的可读性。
1 | // 命名元组 |
unknown
不保证类型,但是能保证类型安全。
1 | let r:unknown = 1 |
如果使用 any
上面的代码就不会报错。unknown
需要做进一步的判断:
1 | let r:unknown = 1 |
never
never
表示永远不存在的值的类型,比如抛出异常或者死循环。表示永远不存在的值的类型,是任何类型的子类型,可以赋值给任何类型,除 never
本身外,没有类型可以赋值给 never
。
1 | // 正确:never可以赋值给任何类型 |
可以用于类型保护中的穷尽检查:
1 | type Shape = "circle" | "square" | "triangle"; |
定义函数
在定义函数的时候推荐将函数的参数和返回值单独用一个 type 来进行定义,这样函数的定义可以做到复用。
1 | // good |
定义对象
虽然 type 也能完成定义,但是在定义对象类型或者类的结构的时候 interface 更适合。
1 | // type Obj = { a: string, b: boolean } |
type 和 interface 的区别
交叉类型 &
,联合类型 |
特性 | interface | type |
---|---|---|
本质 | 结构定义 | 类型别名 |
扩展方式 | 可使用 extends 关键字扩展 |
一般不能直接扩展,但可通过交叉类型& 间接扩展 |
重名处理 | 重名时会自动合并声明 | 重名会报错 |
与类的关系 | 可被类实现 | 不能被类实现 |
支持类型 | 主要用于对象类型,不支持联合类型和交叉类型 | 支持联合类型和交叉类型 |
实际开发的共识是:type 和 interface 都能用的时候用 interface。
索引类型和映射类型
对象的属性(key)叫做索引。映射类型就是使用已有类型创建新类型(通过操作符)。
1 | interface Product { |
泛型
条件类型和工具类型
1 | // 定义函数返回值:string 类型返回 1, number 类型返回 0 |
类型编程的 4 个范式
- 访问性修饰工具:Partial, Required, Readonly
- 结构工具:Pick,Omit,Record
- 集合工具类型:NonNullable,Exclude
- 模式匹配工具类型:ReturnType
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 雨碎江南!