注意: 如果您是 TypeScript 新手,请先查看我们的 TypeScript 入门 教程。
any
类型为变量禁用类型检查,允许它保存任何值类型而不会导致TypeScript编译错误。
这里有一个any
类型的简单示例。你可以阅读本教程的其余部分了解更多。
示例
let item: any;
item = "A string"; // first, item variable is a string
item = 100; // now, its a number
item = false; // now, its a boolean
console.log(item);
// Output: false
item变量首先保存一个字符串,然后是一个数字,最后是一个布尔值——因为它被声明为any
。
JavaScript和TypeScript中any
的区别
在TypeScript中,你必须将变量声明为any
才能允许它保存任何类型。否则,TypeScript会强制执行类型安全。
// TypeScript Code
let value: any = "Hello"; // value is a string initially
value = 42; // Now it's a number, allowed with 'any'
而在JavaScript中,所有变量默认都表现得像any
,这意味着它们可以保存任何类型而无需类型检查。
// JavaScript Code
let value = "Hello"; // value is initially a string
value = 42; // Now it's a number, no error
声明any类型变量
要声明一个带有any
类型的变量,只需在类型注解中使用any
关键字即可。例如,
let variableName: any;
将变量声明为any
会告诉编译器禁用该变量的所有类型检查。
在函数中使用any
你可以使用any
来声明函数参数。
// Function that accepts any type of user detail
function processUserDetail(userDetail: any) {
console.log(userDetail);
}
// Calls function with a string
processUserDetail("Jack");
// Calls function with a number
processUserDetail(27);
// Calls function with a boolean
processUserDetail(true);
输出
Jack 27 true
在这里,我们定义了一个名为processUserDetail()
的函数,它接受一个类型为any
的参数userDetail
。
我们在函数中传递了三种类型的参数
- 一个字符串
"Jack"
- 一个数字27
- 一个布尔值
true
示例:在对象中使用any
let employeeDetails: any = {
name: "Carol",
age: 35
}
// Adding a new property "country" to employeeDetails
employeeDetails.country = "UK";
console.log(employeeDetails);
输出
{ name: 'Carol', age: 35, country: 'UK' }
在此示例中,我们将any
与employeeDetails
对象一起使用。这允许employeeDetails
在没有TypeScript错误的情况下接受新属性country
。
现在,让我们看看如果我们不在employeeDetails
对象中使用any
,而是使用定义的对象结构会发生什么。
let employeeDetails: { name: string; age: number} = {
name: "John",
age: 30,
};
// Attempt to add the country property
employeeDetails.country = "UK";
console.log(employeeDetails);
在这里,我们尝试将新属性country
添加到employeeDetails
,但这会引发错误。
不使用any
,TypeScript会确保你只能添加或修改定义中提到的属性。
使用any的缺点
在TypeScript中使用any
提供了灵活性,但它也带来了一些缺点。其中一些是:
1. 丢失类型安全
使用any
会禁用TypeScript对该变量的类型检查。例如,
let data: any = "Hello";
console.log(data.toUpperCase()); // Works fine, outputs: "HELLO"
data = 123;
console.log(data.toUpperCase()); // Runtime error: data.toUpperCase is not a function
- 最初,
data
是一个字符串,所以toUpperCase()
可以正常工作。 - 将
data
更改为数字后,尝试调用toUpperCase()
会导致运行时错误,因为数字没有此方法。 any
类型阻止TypeScript在编译时捕获此问题,从而导致运行时错误。
2. 使重构具有风险
在没有类型检查的情况下,重构代码可能会很危险。考虑一个用any
声明的对象details
。
let details: any = { name: "Alice", age: 30 };
如果我们重构"name"
为"firstName"
,然后尝试访问原始的name
属性,TypeScript不会在编译时将其标记为错误。
console.log(details.name); // No TypeScript error, yet it will be undefined at runtime.
3. 降低代码的可理解性和可维护性
过度使用any
会使代码库难以理解和维护。例如,
let item: any = { id: 1, title: "New Item" };
在这里,随着时间的推移,很难理解"item"
是什么或应该是什么。
另请阅读