什么是void,什么时候使用void类型?never和void的区别

在 TypeScript 中,voidnever 是两种不同的类型,用于表示不同的场景。以下是它们的详细解释和区别:

一、void 类型

定义
void 表示没有任何返回值的类型,常用于函数返回值类型注解。

使用场景

  1. 函数不返回值

    javascript 复制代码
    function logMessage(message: string): void {
      console.log(message);
      // 没有显式 return 或 return undefined
    }
  2. 可选属性

    javascript 复制代码
    interface Config {
      onSuccess?: () => void; // 可选回调,返回值为 void
    }
  3. 泛型约束

    javascript 复制代码
    type Callback<T = void> = (arg: T) => void;

二、never 类型

定义
never 表示永远不会出现的值的类型,常用于以下场景:

  1. 函数永远不会返回(抛出异常或无限循环):

    javascript 复制代码
    function throwError(message: string): never {
      throw new Error(message);
    }
    
    function infiniteLoop(): never {
      while (true) {}
    }
  2. 不可能存在的类型(如永不为真的条件分支):

    javascript 复制代码
    type Shape = Circle | Square;
    
    function getArea(shape: Shape): number {
      switch (shape.kind) {
        case "circle":
          return Math.PI * shape.radius ** 2;
        case "square":
          return shape.sideLength ** 2;
        default:
          const _exhaustiveCheck: never = shape; // 确保所有情况都被处理
          return _exhaustiveCheck;
      }
    }

三、核心区别对比

特性 void never
含义 表示 "没有值"(常用于无返回值的函数) 表示 "永远不会出现的值"
可赋值性 只能赋值为 undefined(非严格模式下还可赋值为 null 不能赋值给任何类型(除了自身)
可被赋值 可以被 undefinednull 赋值(非严格模式) 任何类型都不能赋值给 never
典型场景 函数无返回值 抛出异常、无限循环、类型保护

四、示例对比

1. 函数返回值
javascript 复制代码
// void
function greet(): void {
  console.log("Hello!");
  // 默认返回 undefined
}

// never
function fail(): never {
  throw new Error("Failed!");
}
2. 类型兼容性
javascript 复制代码
let v: void = undefined; // 合法
let n: never = undefined; // 错误:不能将 undefined 赋值给 never

// 错误:不能将 never 赋值给其他类型(除了 never 自身)
let num: number = fail(); // 错误

五、常见问题

1. void 和 undefined 的区别
  • void 是一种类型,表示 "没有返回值"。
  • undefined 是一个实际的值,用于表示变量未被赋值或函数没有显式返回。
2. 何时使用 never
  • 当函数永远不会正常结束时(如抛出异常、无限循环)。
  • 在类型守卫中确保所有情况都被处理(如示例中的 _exhaustiveCheck)。
3. never 的实际应用
javascript 复制代码
// 类型守卫
function assertIsString(value: unknown): asserts value is string {
  if (typeof value !== "string") {
    throw new Error("Not a string!"); // 返回 never
  }
}

// 工具类型
type NonNullable<T> = T extends null | undefined ? never : T;

六、总结

  • void :用于表示函数没有返回值,或变量可能为 undefined
  • never:用于表示永远不会发生的情况,如异常抛出、无限循环或类型系统中的穷尽检查。

理解两者的区别有助于编写更精确的类型定义和更健壮的代码。

相关推荐
神秘面具男0332 分钟前
NFS 服务器 iSCSI 服务器
运维·服务器
iconball35 分钟前
个人用云计算学习笔记 --17(DNS 服务器)
linux·运维·笔记·学习·云计算
iconball38 分钟前
个人用云计算学习笔记 --16(DHCP 服务器)
linux·运维·笔记·学习·云计算
cpsvps39 分钟前
容器主机名解析在香港服务器内部网络的调试方案
运维·服务器·网络
Lin_Aries_042140 分钟前
部署 Jenkins 服务器
运维·服务器·docker·容器·云计算·jenkins
vortex542 分钟前
在 Kali Linux 上配置 MySQL 服务器并实现 Windows 远程连接
linux·数据库·mysql
专注VB编程开发20年1 小时前
C#,VB.net有什么类库可以内存解压rar中某个子文件
运维·服务器·zip·rar·解压·sharpcompress·sevenzipsharp‌
迷迷的k1 小时前
云服务器 + Jenkins 实现项目自动化部署与上线
java·运维·自动化·jenkins
杨云龙UP1 小时前
CentOS 7上离线部署MySQL 8.0.X操作指南(二进制压缩包部署+独立目录部署,不在自动默认路径配置下安装)
linux·运维·服务器·mysql·centos
Ahu_iii2 小时前
【Linux】基础知识与操作汇总:一份给新手的 Linux 学习总结
linux·运维·学习