跳到主要内容

特殊类型

让我们深入了解 anyunknownvoidnever 这四个 TypeScript 中的特殊类型的用途和区别。

1. any 类型

  • 用途:

    • any 类型用于表示任意类型。可以对 any 类型的变量进行任何操作,而不会触发 TypeScript 的类型检查。
    • 主要用于与动态类型的 JavaScript 代码集成,或者在迁移现有 JavaScript 项目到 TypeScript 时,为那些尚未明确类型的值提供一个通用的类型。
  • 示例:

    let value: any = 42;
    value = "hello";
    value = [1, 2, 3];
  • 注意:

    • 使用 any 可能导致类型安全性下降,因此应谨慎使用。尽量避免在新的 TypeScript 代码中过度使用 any

2. unknown 类型

  • 用途:

    • unknown 类型用于表示未知类型,相对于 any 是类型安全的。变量被赋予 unknown 类型后,需要进行类型检查或断言才能安全地使用它。
    • 当不确定变量的确切类型时,可以使用 unknown 代替 any
  • 示例:

    let userInput: unknown;

    // 使用 unknown 类型的值
    let userName: string;
    if (typeof userInput === 'string') {
    userName = userInput; // OK,因为此时 TypeScript 知道 userInput 是 string 类型
    }

3. void 类型

  • 用途:

    • void 类型主要用于表示没有返回值的函数或表达式。通常用于标识函数的返回值为空(或者根本没有返回值)。
  • 示例:

    function logMessage(message: string): void {
    console.log(message);
    }

    let result: void = logMessage("Hello, TypeScript!");
  • 注意:

    • 变量声明为 void 类型的情况相对较少,通常用于接收没有返回值的函数的返回值。
    • void 类型,则只能将 null 或 undefined 值分配给该变量。

4. never 类型

  • 用途:

    • never 类型表示永远不会有值的类型,通常用于表示异常抛出、无限循环等不正常的程序行为。
  • 示例:

    function throwError(message: string): never {
    throw new Error(message);
    }

    function infiniteLoop(): never {
    while (true) {
    console.log("This is an infinite loop!");
    }
    }
  • 注意:

    • never 类型在日常应用中相对较少见,但在一些高级的类型系统设计中可能会派上用场。

区别总结

  1. 类型安全性:

    • any 是非类型安全的,可以对其进行任何操作而不触发类型检查。
    • unknown 是类型安全的,需要进行类型检查或断言才能安全地使用它。
  2. 类型确定性:

    • any 表示任意类型,不提供类型信息。
    • unknown 表示未知类型,需要进行类型检查后才能使用。
  3. 返回值类型:

    • void 表示没有返回值的函数或表达式。
    • never 表示永远不会有值的类型,通常用于异常抛出或无限循环。

选择使用哪种类型取决于代码的需求和设计目标。在新的 TypeScript 代码中,通常应避免过度使用 any,而是尽可能使用更安全的类型,如 unknown