any
any
类型即任意类型,该类型的变量不受任何约束,编译时会跳过类型检查。它既是顶部类型,又是底部类型。
当 any
为顶部类型时,它是所有类型的父类型,所有值都可以赋给该类型的变量。示例代码如下。
let a: any;
a = 1;
a = "hello";
a = true;
a = [1, 2, 3]
a = function () { console.log("hello") };
a = { x: "aa", y: 1 };
由于 any
会绕过编译检查,因此可以对 any
类型的变量进行任何操作,且不会引起编译错误。
let a: any;
console.log(a.x);
a.helloWorld("good", 1);
a.y = function () { };
a[1] = "123"
当 any
为底部类型时,它是所有类型的子类型,它的值可以赋给所有类型的变量。示例代码如下。
let a: any;
let boolean1: boolean = a;
let number1: number = a;
let string1: string = a;
let function1: () => void = a;
let object1: { x: number } = a;
let array1: number[] = a;
由于 TypeScript 中类型定义不是必需的,如果一个变量没有显式类型定义且编译器无法自动推导其类型,则该变量默认为 any
类型。例如,以下代码声明了一个 sum()
函数,但它的参数及返回值都没有显式类型定义,因此编译器会将参数 a
、参数 b
,以及 sum()
函数的返回值都视为 any
类型。
function sum(a, b) {
return a + b;
}
总而言之,一旦使用 any
类型,类型检查器将完全失去作用,任何操作都是允许的。因此,any
是一种极其不推荐的类型,不到万不得已切勿使用。它会绕过 TypeScript 的编译检查,因此问题只能在程序运行时才可能发现,维护成本将大幅增加。例如,以下代码在编译时不会有任何问题,但在运行时将出现错误。
let object1: any = {
sayHello: function () {
console.log("hello world");
}
};
//方法名称少写了s,可以正常编译,但程序在运行时会因为找不到ayHello()方法报错
object1.ayHello();