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
}
}
酷客网相关文章:
评论前必须登录!
注册