any,never,uknown这几个类型再TS类型系统里面扮演“底"和"顶"的角色,下面从集合视角+可赋值关系分析
类型总图
- never:空集合(没有任何值)
- 具体类型(string,number,字面量类型等):中间层
- unknown:全集(所有值)
- any:特殊逃逸类型,不遵守正常类型规则(既像顶又像底)
never:底类型
never表示不可能有值;常见来源:
- 永远抛错的函数
- 死循环函数
- 被收窄后不可能到达的分支(穷尽检查) 关系:
- never可以赋值给任何类型(因为没有值,赋什么都不会出错)
- 任何类型都不能赋值给never(除了never自己)
- T|never=>T
- T&never=>never
uknown:(安全顶类型)
unknown表示我知道他可能是任何值,但我不知道具体是什么 关系:
- 任何类型都可以赋值给unknown;
- unknown只能赋值给unknown和any(不能直接给string/number等) *T|unknown=>unknown
- T&unknown =>T
any:不安全万能类型
any表示关闭类型检查,他不是纯粹的顶或底,而是一个特权类型: 关系(危险)
- 任何类型都可以赋值给any
- any也可以赋值给任何类型
- 对any做任何操作都不报类型错误
unknown Vs any
- unknown,我不知道,但我会先检查再用(安全)
- any:我不检查,直接用(不安全)
一句话记忆
never:最小,表示“不可能”unknown:最大且安全,表示“未知但需检查”any:跳过检查,表示“我不管类型了”