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

相关推荐
申君健24864182772023 小时前
Vapor 核心数据结构:Block原理
前端
Csvn3 小时前
工程化专题 | 改完组件保存,浏览器毫无反应,重启 dev server 又好了——气不气?
前端
我有满天星辰4 小时前
Vue 指令完全指南:从 Vue 2 到 Vue 3 的演进与实战
前端·javascript·vue.js
光影少年4 小时前
RN 渲染原理:不依赖WebView,原生控件渲染
前端·react native·react.js·前端框架
小白学过的代码4 小时前
# flv.js / mpegts.js 播不了国标摄像头(H.265 + G.711A)?纯前端 Jessibuca 无后端方案(附完整代码)
前端·javascript·h.265
console.log('npc')4 小时前
AI Agent 前端流式渲染核心技术文档(SSE \+ WebSocket \+ 打字机渲染)
前端·人工智能·websocket
法外狂徒14 小时前
将 Pi Agent 接入 HagiCode 的实践之路
服务器·前端·人工智能
IT_陈寒4 小时前
React中useEffect的依赖项把我坑惨了
前端·人工智能·后端
ShineWinsu5 小时前
对于Linux:基于UDP实现简单聊天室功能
linux·c++·面试·udp·笔试·进程·简单聊天室
广州华水科技5 小时前
单北斗GNSS在变形监测中的优势与应用分析
前端