TypeScript any 类型

注意: 如果您是 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' }

在此示例中,我们将anyemployeeDetails对象一起使用。这允许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"是什么或应该是什么。


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战