跳到主要内容

TypeScript - Any 类型

any 类型是 TypeScript 中一种特殊的类型,它可以代表任何值。当你不确定变量的类型或者变量的类型尚未定义时,可以使用 any 类型。any 类型在将 JavaScript 代码转换为 TypeScript 时特别有用。

任何值的占位符​

声明为 any 类型的变量可以存储任何数据类型的值。

let x: any;
x = "Hello";
x = 23;
x = true;

这里,变量 x 被声明为 any 类型。这允许我们给变量分配任何值,如字符串、数字、布尔值等。

使用 typeof 操作符检查 any 类型变量的类型时,结果将是 undefined。

let x: any;
console.log(typeof x); // undefined

编译后生成的 JavaScript 代码:

let x;
console.log(typeof x);

输出结果:

undefined

让我们通过以下 TypeScript 示例来理解 any 类型:

let x: any;
console.log(typeof x); // undefined
x = "Hello";
console.log(typeof x); // string
x = 23;
console.log(typeof x); // number
x = true;
console.log(typeof x); // boolean

在这个示例中,变量 x 被声明为 any 类型。然后我们给它分配了不同类型的值(字符串、数字和布尔值)。

编译后生成的 JavaScript 代码:

let x;
console.log(typeof x);
x = "Hello";
console.log(typeof x);
x = 23;
console.log(typeof x);
x = true;
console.log(typeof x);

输出结果:

undefined
string
number
boolean

任何类型的函数参数​

你也可以定义一个函数,使其参数为 any 类型。

function func(para: any) {
}

这里,函数 func 可以接受任何类型的参数(数字、字符串、布尔值等)。

让我们来看一个示例:

function greet(name: any): string {
return `Hello Mr. ${name}`;
}
console.log(greet('Shahid'));
console.log(greet(123));

函数 greet 被定义为接受 any 类型的参数。因此,它可以接受任何类型的参数(数字、字符串等)。

我们调用了 greet 函数,传递了两个不同类型的值(字符串和数字)。你可以注意到,它对这两种类型的参数都有效。

编译后生成的 JavaScript 代码:

function greet(name) {
return `Hello Mr. ${name}`;
}
console.log(greet('Shahid'));
console.log(greet(123));

输出结果:

Hello Mr. Shahid
Hello Mr. 123

任何类型的对象​

你也可以定义一个 any 类型的对象。这样的对象可以具有任何类型的属性。

const student: any = {
name: "John Doe",
age: 32,
isEnrolled: true,
};

这里,student 对象被声明为 any 类型。它包含三个不同类型的属性。

尝试以下示例:

const student: any = {
name: "John Doe",
age: 32,
isEnrolled: true,
};
console.log(student.name);
console.log(student.age);
console.log(student.isEnrolled);

编译后生成的 JavaScript 代码:

const student = {
name: "John Doe",
age: 32,
isEnrolled: true,
};
console.log(student.name);
console.log(student.age);
console.log(student.isEnrolled);

输出结果:

John Doe
32
true

为什么使用 any 类型?​

使用 any 类型的一个原因是当你处理未进行类型检查的代码时。例如,如果你正在使用现有的 JavaScript 代码,any 类型在将 JavaScript 代码转换为 TypeScript 时非常有用。如果你正在使用一个不是用 TypeScript 编写的第三方库,你可能需要在 TypeScript 代码中为变量使用 any 类型。

另一个使用 any 类型的原因是当你不确定值的类型时。例如,一个接受用户输入的函数可以被定义为 any 类型,以处理用户提供的任何类型的数据。

在新的 TypeScript 代码中不鼓励使用 any 类型。建议在使用 any 类型时要小心。如果你过于频繁地使用 any 类型,你的代码将变得不那么类型安全。

类型断言​

使用类型断言来缩小 any 变量的类型。

let value: any = "hello world";
let lenStr: number = (value as string).length;
console.log(lenStr);

在上面的代码中,变量 value 被定义为 any 类型。然后它被缩小为字符串类型。

编译后生成的 JavaScript 代码:

let value = "hello world";
let lenStr = value.length;
console.log(lenStr);

输出结果:

11

注意事项​

如果不小心使用,any 类型可能会导致错误。

在下面的示例中,我们尝试访问一个不存在的属性 enrYear。这将导致运行时错误,因为我们已经将 student 对象定义为 any 类型。注意它不会显示编译时错误。

const student: any = {
name: "John Doe",
age: 32,
isEnrolled: true,
};
console.log(student.name);
console.log(student.age);
console.log(student.enrYear);

编译后生成的 JavaScript 代码:

const student = {
name: "John Doe",
age: 32,
isEnrolled: true,
};
console.log(student.name);
console.log(student.age);
console.log(student.enrYear);

输出结果:

John Doe
32
undefined

any 和 unknown​

当一个变量被声明为 any 类型时,你可以访问其不存在的属性。

示例:声明为 any 的变量

let user: any;
user.isEnrolled;

上面的 TypeScript 代码在编译时不会显示任何错误。但它将在运行时抛出以下错误:

Cannot read properties of undefined (reading 'isEnrolled')

示例:声明为 unknown 的变量

let user: unknown;
user.isEnrolled;

上面的代码将显示以下编译时错误:

'user' is of type 'unknown'.

小结​

any 类型在 TypeScript 中是一个强大的工具,允许你在类型系统中保持灵活性。然而,过度使用 any 类型会削弱 TypeScript 提供的类型安全优势。在处理现有 JavaScript 代码或第三方库时,any 类型非常有用。但在新的 TypeScript 代码中,应尽量避免使用 any 类型,以保持代码的类型安全。当你需要使用 any 类型时,请谨慎操作,以避免潜在的运行时错误。