JavaScript is required
Kotae
Touko
2 years ago|views:65

TypeScript类型-any,unknown,nerver

TypeScript类型

1.any类型

any 类型表示没有任何限制,该类型的变量可以赋予任意类型的值

变量类型一旦设为 any TypeScript 实际上会关闭这个变量的类型检查。即使有明显的类型错误,只要句法正确,都不会报错。

let x:any = 'hello';

x(1) // 不报错
x.foo = 100; // 不报错

由于这个原因,应该尽量避免使用 any 类型,否则就失去了使用 TypeScript 的意义

any 类型适用于

  1. 出于特殊原因,需要关闭某些变量的类型检查,就可以把该变量的类型设为 any
  2. 为了适配以前老的 JavaScript 项目,让代码快速迁移到 TypeScript,可以把变量类型设为 any

总之,TypeScript 认为,只要开发者使用了 any 类型,就表示开发者想要自己来处理这些代码,所以就不对 any 类型进行任何限制,怎么使用都可以。

从集合论的角度看 any 类型可以看成是所有其他类型的全集,包含了一切可能的类型。TypeScript 将这种类型称为“顶层类型”(top type),意为涵盖了所有下层。

对于开发者没有指定类型、TypeScript 必须自己推断类型的那些变量,如果无法推断出类型,TypeScript 就会认为该变量的类型是 any

TypeScript 提供了一个编译选项 noImplicitAny,打开该选项,只要推断出 any 类型就会报错。

$ tsc --noImplicitAny app.ts

这里有一个特殊情况,即使打开了 noImplicitAny ,使用 let var 命令声明变量,但不赋值也不指定类型,是不会报错的。

由于这个原因,建议使用 let var 声明变量时,如果不赋值,就一定要显式声明类型,否则可能存在安全隐患。

any 类型除了关闭类型检查,还有一个很大的问题,就是它会“污染”其他变量。它可以赋值给其他任何类型的变量(因为没有类型检查),导致其他变量出错。

2.unknow类型

它与 any 含义相同,表示类型不确定,可能是任意类型,但是它的使用有一些限制,不像 any 那样自由,可以视为严格版的 any

unknow any 的相似之处,在于所有类型的值都可以分配给 unknow 类型

unknow 类型跟 any 类型的不同之处在于,它不能直接使用。主要有以下几个限制。

  1. unknow 类型的变量,不能直接赋值给其他类型的变量(除了 any 类型和 unknow 类型)。
  2. 不能直接调用 unkonw 类型变量的方法和属性
  3. unknow 类型变量能够进行的运算是有限的,只能进行比较运算(运算符=====!=!==||&&?)、取反运算(运算符 ! )、typeof 运算符和 instanceof 运算符这几种,其他运算都会报错

使用 unknow 类型变量需要缩小 unknow 变量的类型范围(将一个不确定的类型缩小为更明确的类型),确保不会出错

let a:unknown = 1;

if (typeof a === 'number') {
  let r = a + 10; // 正确
}

总之,unknow 可以看作是更安全的 any。一般来说,凡是需要设为 any 类型的地方,通常都应该优先考虑设为 unknow 类型。

在集合论上,unknow 也可以视为所有其他类型(除了any)的全集,所以它和 any 一样,也属于 TypeScript 的顶层类型。

3.never类型

由于不存在任何属于“空类型”的值,所以该类型被称为 never,即不可能有这样的值

never 类型的一个重要特点是,可以赋值给任意其他类型。

为什么 never 类型可以赋值给任意其他类型呢?这也跟集合论有关,空集是任何集合的子集。TypeScript 就相应规定,任何类型都包含了 never 类型。因此,never 类型是任何其他类型所共有的,TypeScript 把这种情况称为“底层类型”(bottom type)。

总之,TypeScript 有两个“顶层类型”(anyunknow),但是“底层类型”只有 never 唯一一个。

tags:

TypeScript
0
comments:
It's deserted here, it looks like no one's been here