TypeScript+Vue.js前端开发从入门到精通
上QQ阅读APP看书,第一时间看更新

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等基础类型外的类型。从表现来看,对象中可以封装属性和方法,我们会在后续章节中更加详细地介绍对象的类型,本节不再赘述。