TypeScript any类型

any类型是从TypeScript 1.0开始就支持的一种顶端类型。any类型使用any关键字作为标识,示例如下:

let x: any;

在TypeScript中,所有类型都是any类型的子类型。我们可以将任何类型的值赋值给any类型。示例如下:

let x: any;

x = true;
x = 'hi';
x = 3.14;
x = 99999n;
x = Symbol();
x = undefined;
x = null;
x = {};
x = [];
x = function () {};

需要注意的是,虽然any类型是所有类型的父类型,但是TypeScript允许将any类型赋值给任何其他类型。示例如下:

let x: any;

let a: boolean   = x;
let b: string    = x;
let c: number    = x;
let d: bigint    = x;
let e: symbol    = x;
let f: void      = x;
let g: undefined = x;
let h: null      = x;

在any类型上允许执行任意的操作而不会产生编译错误。例如,我们可以读取any类型的属性或者将any类型当作函数调用,就算any类型的实际值不支持这些操作也不会产生编译错误。示例如下:

const a: any = 0;

a.length;

a();

a[0];

在程序中,我们使用any类型来跳过编译器的类型检查。如果声明了某个值的类型为any类型,那么就相当于告诉编译器:不要对这个值进行类型检查。当TypeScript编译器看到any类型的值时,也会对它开启“绿色通道”,让其直接通过类型检查。在将已有的JavaScript程序迁移到TypeScript程序的过程中,使用any类型来暂时绕过类型检查是一项值得掌握的技巧。示例如下:

function parse(data: any) {
   //               ~~~
   //               编译器不检查data参数的类型

   console.log(data.id);
}

从长远来看,我们应该尽量减少在代码中使用any类型。因为只有开发者精确地描述了类型信息,TypeScript编译器才能够更加准确有效地进行类型检查,这也是我们选择使用TypeScript语言的主要原因之一。

--noImplicitAny

TypeScript中的类型注解是可选的。若一个值没有明确的类型注解,编译器又无法自动推断出它的类型,那么这个值的默认类型为any类型。示例如下:

function f1(x) {
   //      ~
   //      参数x的类型为any
   console.log(x);
}

function f2(x: any) {
   console.log(x);
}

此例中,函数f1的参数x没有使用类型注解,编译器也无法从代码中推断出参数x的类型。于是,函数f1的参数x将隐式地获得any类型。

最终,函数f1的类型等同于函数f2的类型。在这种情况下,编译器会默默地忽略对参数x的类型检查,这会导致编译器无法检查出代码中可能存在的错误。

在大多数情况下,我们想要避免上述情况的发生。因此,TypeScript提供了一个“--noImplicitAny”编译选项来控制该行为。当启用了该编译选项时,如果发生了隐式的any类型转换,那么会产生编译错误。示例如下:

function f(x) {
   //     ~
   //     编译错误!参数'x'具有隐式的'any'类型

   console.log(x);
}

此例中,参数x具有隐式的any类型,因此将产生编译错误。

我们可以使用如下方式在“tsconfig.json”配置文件中启用“–noImplicitAny”编译选项:

{
   "compilerOptions": {
       "noImplicitAny": true
   }
}

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!