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 确保代码完整性

相关推荐
一只叫煤球的猫37 分钟前
ThreadForge 源码解读一:ThreadScope 如何把并发任务放进清晰边界?
java·面试·开源
洛_尘1 小时前
Python 5:使用库
java·前端·python
Bigger1 小时前
Bun 能上生产吗?我的实战结论
前端·node.js·bun
kyriewen3 小时前
你的前端滤镜慢得像PPT?用Rust+WebAssembly,一秒处理4K图
前端·rust·webassembly
kyriewen113 小时前
你等的Babel编译,够喝三杯咖啡了——用Rust重写的SWC,只需眨个眼
开发语言·前端·javascript·后端·性能优化·rust·前端框架
IT_陈寒3 小时前
SpringBoot自动配置坑了我,原来要这样绕过去
前端·人工智能·后端
东方小月3 小时前
Claude Code 完整上手指南:MCP、Skills、第三方模型配置一次搞定
前端·人工智能·后端
XZ探长4 小时前
基于 Trae Solo 移动办公修复 Vue3 前端服务问题
前端
小程故事多_804 小时前
[大模型面试系列] 深度解析ReAct框架,大模型Agent的“思考+行动”底层逻辑
人工智能·react.js·面试·职场和发展·智能体
蝎子莱莱爱打怪4 小时前
Claude Code 省 Token 小妙招:RTK + Caveman 组合拳
前端·人工智能·后端