any和unknown、never的区别

84 阅读2分钟

any类型

any类型是 TS 中的一种特殊类型,它表示任何类型都可以赋值给它,即不进行类型检查。(也就是被大家调侃的anyScript)

1、声明变量为any类型

let value: any = 5;
value = "Hello, World!";  // string
value = true;  // boolean
value = new Date()  // date
value = 100n  // bigint
value = new Map()  // map
// 可以将 value 分配为任何类型的值

2、作为函数参数或返回值

function doSomething(value: any): any {
    // 这个函数接受任何类型的参数并返回任何类型的值
    return value;
}

3、与第三方库集成

当你使用第三方库,或者处理动态数据,有时 TypeScript 无法推断出正确的类型,这时可以使用any来解决问题:

const data: any = fetchDataFromApi(); 
// 假设 fetchDataFromApi() 返回未知类型的数据

4、逐步迁移

如果你正在将 JavaScript 项目迁移到 TypeScript,any 类型可以用来逐步迁移,允许你在不改变太多代码的情况下引入类型注解

unknown类型

unknown 类型也可以表示任何值,但与 any 不同,它是提高了类型安全的。当你将一个值声明为 unknown 类型时,你必须在使用之前进行类型检查或类型断言。这可以帮助你在编译时捕获类型错误。

1、动态数据

当你从外部数据源获得数据,且无法确定其类型时,可以将其声明为 unknown 类型

const resData : unknown = await ajax.get('/api/users')

2、类型安全

如果你编写一个函数,不确定参数的类型,但希望保持类型安全,可以使用 unknown

let userInput: unknown = getUserInput(); // 从外部获取用户输入

if (typeof userInput === "string") {
  let strLength: number = userInput.length; // 合法
}

// 或者使用类型断言
let strLength: number = (userInput as string).length;

never 类型

never 类型用于表示不会正常返回的函数或处理不可能发生的情况,它有助于提高代码的类型安全性,并确保在编译时捕获潜在的错误

1、抛出异常

当一个函数总是抛出异常而不会正常返回时,可以将其返回类型标记为 never

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

2、类型保护

never 类型常用于类型保护,帮助编译器理解某些操作将导致程序中的类型错误

function assertNever(x: never): never {
  throw new Error("Unexpected object: " + x);
}

function processValue(value: string | number) {
  switch (typeof value) {
    case "string":
      // 处理字符串
      break;
    case "number":
      // 处理数字
      break;
    default:
      assertNever(value); // 这里会抛出错误,因为 value 的类型为 never
  }
}

tip: 个人学习笔记,如有错误,敬请雅正