TypeScript 中的 any 与 unknown

30 阅读2分钟

在 TypeScript 中,any 和 unknown 在处理类型不明确或者需要动态类型的情况下非常有用,但它们之间存在重要的区别。本文将深入探讨 any 和 unknown 之间的差异,以及如何正确使用它们。

1. 什么是 any?

any 是 TypeScript 中的一种非常宽泛的类型,它表示一个变量可以持有任何类型的值。这意味着可以在一个变量上执行任何操作,而 TypeScript 不会发出任何类型检查的警告。这给了编程者极大的自由,但也可能导致代码中的类型错误。

下面是一个使用 any 的例子:


let myVariable: any = "Hello, world!";

myVariable = 42; // 合法

myVariable.toUpperCase(); // 合法

在上面的代码中,myVariable 首先被赋值为一个字符串,然后又被赋值为一个数字。它可以执行字符串和数字的操作,因为它是 any 类型。

2. 什么是 unknown?

unknown 也是一个宽泛的类型,但相对于 any 更安全。一个变量被声明为 unknown 类型时,你不能随意执行操作,而需要进行类型检查或类型断言。

下面是一个使用 unknown 的例子:


let userInput: unknown = "Hello, TypeScript!";

const length = userInput.length; // 报错:'length' 不存在于类型 'unknown' 上

在上面的代码中,尝试获取 userInput 的 length 属性会引发错误,因为 unknown 类型上没有 length 属性。为了安全地使用 unknown 类型,需要进行类型检查或类型断言。

3. 二者区别:

  1. any 允许你在变量上执行任何操作,而 unknown 要求进行类型检查或类型断言。

  2. 使用 any 时,可能会放弃 TypeScript 的类型检查,而使用 unknown 时,可以在必要时进行类型安全的恢复。

  3. 使用 any 时,通常是在从 JavaScript 迁移到 TypeScript 的过程中,或者在处理不明确类型的外部数据时。

  4. 使用 unknown 时,适用于需要更强的类型安全性的情况,例如,处理用户输入或外部 API 数据。

4. 代码示例

下面是一个示例,演示如何正确使用 unknown 类型:


function processUserInput(input: unknown): void {

  if (typeof input === "string") {

    const length = input.length; // 安全,因为已经检查了类型

    console.log("Input length:", length);

  } else {

    console.log("Input is not a string");

  }

}

  


processUserInput("Hello, TypeScript!"); // 安全

processUserInput(42); // 安全

在这个示例中,使用 typeof 检查了输入的类型,以确保只有在输入为字符串时才尝试获取长度,这确保了类型的安全性。

5. 总结

any 和 unknown 的使用场景和类型安全性不同,在代码中要谨慎使用 any,尽量使用更具类型安全性的 unknown,并在必要时进行类型检查或类型断言,以充分利用 TypeScript 的类型检查功能,减少潜在的类型错误。

希望本文对您有所帮助!