TypeScript中的any,never,uknown

3 阅读1分钟

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:跳过检查,表示“我不管类型了”