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();