2.3.3 any、never与object类型
在前面的章节中,我们介绍过void类型,any类型与之相反,其可以表示任意类型。虽然TypeScript中要求变量都有明确的类型,但是有的时候,我们确实需要一个变量既可以存储某个类型的数据,又可以存储其他类型的数据。甚至需要在运行时动态地改变变量的值的类型,例如一开始存储数值数据,之后存储字符串数据等。这时就可以使用any类型来标记变量。例如下面的代码是完全合法的:
【源码见附件代码/第2章/7.any-never/7.any-never.ts】
//先赋值为数值 var some:any = 1; //后修改为字符串 some = "Hello";
any类型也有另一层意思,它相当于间接地告诉了TypeScript编译器不要检查当前变量的类型,也就是说,我们使用any类型的变量获取任何属性和调用任何方法都不会产生编译异常,示例如下:
【源码见附件代码/第2章/7.any-never/7.any-never.ts】
//获取任意属性 some.a; //调用任意方法 some.getA();
当我们声明了一个变量,但是并未指定类型时,也可以认为其类型为any,示例如下:
【源码见附件代码/第2章/7.any-never/7.any-never.ts】
var some2; some2 = 1; some2 = "s";
因此,any本身是一把双刃剑,为编码带来灵活性的同时也降低了程序的安全性。通常,如果可以明确定义变量的类型,尽量不要使用any,any更多会应用在元素类型不定的数组上。
never类型通常用于总是会抛出异常的函数,或永远没有终结的函数的返回值。其语义上表示永远不会存在的值的类型。因此,逻辑上虽然可以声明一个never类型的变量,但是其无法赋任何值,例如下面的代码将产生编译异常:
var n:never; n = 4;
一些可能会使用到never类型的场景如下:
【源码见附件代码/第2章/7.any-never/7.any-never.ts】
顾名思义,object类型为对象类型,即除number、string、boolean、symbol、null等基础类型外的类型。从表现来看,对象中可以封装属性和方法,我们会在后续章节中更加详细地介绍对象的类型,本节不再赘述。