三种特殊类型是: any、unknown、never
any
any 类型表示没有任何限制,可以赋值给任意类型。TypeScript 实际上会关闭这个变量的类型检查。即使有明显的类型错误,只要句法正确,都不会报错。
let str: any = '123'
let num: number = str;
str.push(123)
上面这段代码没有任何 Ts 类型报错,会把错误留到运行时,这是一个很危险的操作。
any 关闭了类型检查,还有一个特别严重的问题就是,它会污染其他变量,它可以赋值给其他任何变量,因为没有类型检查,可能会导致其他类型出错。
污染其他具有正确类型的变量,把错误留到运行时,这就是不宜使用any类型的另一个主要原因。
unknown
为了解决 any 污染变量的问题, TypeScript 引入了 unknown 类型, unknown 可以理解为严格版的 any,语义上表示不确定,可能是任意类型,但是有一些限制。
与 any 的相同之处在于所有类型的值都可以赋值给 unknown 类型的值,不同之处是unknown类型的变量不能直接赋值给其他的变量(除了 any 类型和 unknown 类型)。
区别于 any 的限制有如下几点:
- 不能直接赋值给其他的变量(除了
any类型和unknown类型) - 不能调用
unknown类型的属性和方法 - 只能进行比较运算(运算符
==、===、!=、!==、||、&&、?)、取反运算(运算符!)、typeof运算符和instanceof运算符这几种
那么要怎么才能使用 unknown 类型的变量呢?
答案是只有经过“类型缩小”,unknown类型变量才可以使用。所谓“类型缩小”,就是缩小unknown变量的类型范围,确保不会出错。例如:
let str: unknown = '123'
console.log(str.substring(1)) // 报错
if (typeof str === 'string') {
console.log(str.substring(1)) // /正确
}
总之,unknown可以看作是更安全的any。一般来说,凡是需要设为any类型的地方,通常都应该优先考虑设为unknown类型。
never
为了保持与集合论的对应关系,以及类型运算的完整性,TypeScript 还引入了“空类型”的概念,即该类型为空,不包含任何值。
由于不存在任何属于“空类型”的值,所以该类型被称为never,即不可能有这样的值。
never类型的使用场景,主要是在一些类型运算之中,保证类型运算的完整性,详见后面章节。另外,不可能返回值的函数,返回值的类型就可以写成never
如果一个变量可能有多种类型(即联合类型),通常需要使用分支处理每一种类型。这时,处理所有可能的类型之后,剩余的情况就属于never类型。
never类型的一个重要特点是,可以赋值给任意其他类型。
最后
虽然我很想用自己的语言组织我的理解,但是文字写出来后总觉得表述总觉得差点意思。[手动狗头]