TypeScript中any、unknown、never的区别

在 TypeScript 中,anyunknownnever 是三种特殊的类型,它们有各自的使用场景和区别:


1. any(任意类型,不安全)

  • any 表示 任何类型,它绕过了 TypeScript 的类型检查。
  • 适用于不确定类型的数据,但会丧失类型安全性
  • 可以对 any 类型的变量执行任何操作,不会有编译错误。

示例

ini 复制代码
ts
复制编辑
let value: any;

value = 123;
value = "hello";
value = true;

// 可以调用任意方法,不会有类型错误
value.toUpperCase();  // OK
value();              // OK(即使它不是一个函数)
value.age;            // OK(即使它没有这个属性)

any 的问题

  • 绕过了类型检查,导致代码变得不安全。
  • 一旦一个值是 any,它会污染整个代码,导致类型检查失效。

2. unknown(未知类型,更安全)

  • unknown 也是任意值 的容器,但它比 any 更安全。
  • 不能直接对 unknown 类型的变量执行操作,必须先进行类型检查
  • 适用于不确定类型的变量,但仍想保留类型检查。

示例

ini 复制代码
ts
复制编辑
let value: unknown;

value = 123;
value = "hello";

// 不能直接调用方法(需要类型检查)
value.toUpperCase();  // 报错

// 需要先进行类型检查
if (typeof value === "string") {
  console.log(value.toUpperCase());
}

unknown 的优点

  • any 更安全,因为必须进行类型检查才能操作它。

  • 适用于外部 API 返回值不确定的情况,例如:

    javascript 复制代码
    ts
    复制编辑
    function getData(): unknown {
      return fetch("https://api.example.com/data").then(res => res.json());
    }

3. never(不可能的类型)

  • never 表示 永远不会发生的情况 ,即一个函数永远不会返回

  • 适用于:

    1. 抛出错误的函数。
    2. 死循环的函数。
    3. 严格的类型检查(不应该到达的代码)。

示例

typescript 复制代码
ts
复制编辑
// 1. 抛出错误的函数
function throwError(message: string): never {
  throw new Error(message);
}

// 2. 死循环的函数
function infiniteLoop(): never {
  while (true) {}
}

// 3. 严格的类型检查
function checkType(value: string | number) {
  if (typeof value === "string") {
    console.log("String:", value);
  } else if (typeof value === "number") {
    console.log("Number:", value);
  } else {
    // 这里的 `never` 表示 value 不可能是其他类型
    const unreachable: never = value;
  }
}

never 的作用

  • 确保代码的完整性,不应该有额外的分支
  • TypeScript 可以帮助检查逻辑错误 (如 switch 语句的遗漏分支)。

4. any vs unknown vs never 对比

类型 作用 是否可以赋值给其他类型 是否可以执行操作 安全性
any 任意类型 可以赋值给任何类型 可以直接操作(但不安全) 不安全
unknown 不确定类型 可以赋值给 anyunknown 不能直接操作,必须先判断类型 更安全
never 不可能的类型 不能赋值给任何类型(除了 never 本身) 不能直接使用 最高安全性

5. 什么时候使用?

  • any尽量避免使用,除非你真的不关心类型,比如迁移 JavaScript 代码时。
  • unknown推荐用于 不确定类型的变量,例如 API 返回的数据,然后进行类型检查。
  • never :用于确保代码逻辑的完整性 ,如 switch 语句的默认分支。

总结

类型 主要用途 是否安全
any 任意类型,但不安全 ×
unknown 任意类型,但需要类型检查
never 代码不会执行到的情况,如抛错或死循环

🔹 最佳实践:
尽量避免 any使用 unknown 进行安全检查never 确保代码完整性

相关推荐
在未来等你1 分钟前
Elasticsearch面试精讲 Day 11:索引模板与动态映射
大数据·分布式·elasticsearch·搜索引擎·面试
excel14 分钟前
为什么相同卷积代码在不同层学到的特征完全不同——基于 tfjs-node 猫图像识别示例的逐层解析
前端
知识分享小能手15 分钟前
React学习教程,从入门到精通,React 使用属性(Props)创建组件语法知识点与案例详解(15)
前端·javascript·vue.js·学习·react.js·前端框架·vue
在未来等你16 分钟前
Kafka面试精讲 Day 14:集群扩容与数据迁移
大数据·分布式·面试·kafka·消息队列
用户214118326360217 分钟前
dify案例分享-免费玩转即梦 4.0 多图生成!Dify 工作流从搭建到使用全攻略,附案例效果
前端
CodeSheep17 分钟前
稚晖君又开始摇人了,有点猛啊!
前端·后端·程序员
JarvanMo19 分钟前
Flutter Web vs Mobile:主要区别以及如何调整你的UI
前端
IT_陈寒39 分钟前
Java性能优化:从这8个关键指标开始,让你的应用提速50%
前端·人工智能·后端
程序员清风39 分钟前
快手一面:为什么要求用Static来修饰ThreadLocal变量?
java·后端·面试
天生我材必有用_吴用41 分钟前
Vue3+Node.js 实现大文件上传:断点续传、秒传、分片上传完整教程(含源码)
前端