any、unknown、never 和 void区别

any 类型:

  • any 类型是 TypeScript 中的顶级类型,它可以接受任何类型的值,相当于取消了类型检查。

  • 当将变量声明为 any 类型时,可以赋予它任何值,无论是数字、字符串、布尔值还是其他类型的值。

  • 使用 any 类型可能会降低类型安全性,因为编译器不会对其进行类型检查,所以应该谨慎使用。

    let x: any;
    x = 5; // 可以赋值为数字
    x = "hello"; // 可以赋值为字符串
    x = true; // 可以赋值为布尔值
    
    console.log(x.length); // 由于 x 是 any 类型,编译器不会检查 length 属性的存在性,因此不会报错
    

unknown 类型:

  • unknown 类型表示未知类型的值,它与 any 类型不同,使用 unknown 类型时需要进行类型检查或类型断言来确定其具体类型

  • unknown 类型提供了更严格的类型安全性,因为它要求在使用前进行类型检查。

    let x: unknown;
    x = 5;
    if (typeof x === "number") {
      console.log(x * 2); // 可以进行数值操作
    }
    
    x = "hello";
    if (typeof x === "string") {
      console.log(x.toUpperCase()); // 可以调用字符串方法
    }
    
    console.log(x.length); // 由于 x 是 unknown 类型,编译器会报错,因为 length 属性不一定存在
    

never 类型:

  • never 类型表示永远不会发生的类型,通常用于描述无法返回值的函数或不可达代码

  • 当函数抛出异常、具有无限循环或具有类型保护时,可以将其返回类型标注为 never

    //函数抛出异常的示例:
    
    function throwError(message: string): never {
      throw new Error(message);
    }
    
    throwError("Something went wrong"); // 抛出异常,函数不会返回
    
  • 函数具有无限循环的示例:

    function infiniteLoop(): never {
      while (true) {
        console.log("Hello");
      }
    }
    
    infiniteLoop(); // 无限循环,函数不会返回
    
  • 函数具有类型保护的示例:

    function checkNever(x: string | number): never {
      throw new Error("Unexpected value: " + x);
    }
    
    function processValue(x: string | number) {
      if (typeof x === "string") {
        // 在这个条件分支中,x 被推断为 string 类型
        console.log(x.toUpperCase());
      } else {
        // 在这个条件分支中,x 被推断为 number 类型
        checkNever(x); // 抛出异常,函数不会返回
      }
    }
    

void 类型:

  • void 类型表示没有任何类型,通常用于表示函数没有返回值。
  • 函数声明为 void 类型意味着它不会返回任何值。
  • 变量可以被赋值为 undefined 或 null,但不能赋值为其他类型的值。
    function logMessage(): void {
      console.log("Hello, TypeScript");
    }
    
    const result: void = logMessage(); // 函数没有返回值,result 为 undefined
    
    let myVoidVariable: void;
    myVoidVariable = undefined; // 可以赋值为 undefined
    myVoidVariable = null; // 可以赋值为 null
    

你可能感兴趣的:(javascript,前端)