本文深入解析TypeScript中void、never、any和unknown四种类型的核心差异。通过对比表与代码示例,阐明void用于无返回值函数,never表示不可达代码,any跳过类型检查,而unknown提供类型安全的任意值处理。文章提供了实际开发中的类型定义建议与常见疑问解答,帮助开发者编写更安全的TypeScript代码。
TypeScript 的类型系统借助 any、unknown、void、never 实现了灵活的类型管控。本文深入剖析其核心差异,并提供实际开发中的使用建议,助力编写更安全的代码。
类型对比速查表
| 类型 | 可赋值给任意类型 | 任意值可赋值给它 | 类型安全 | 典型场景 |
|---|---|---|---|---|
| any | ✔️ 允许 | ✔️ 允许 | ❌ 不安全 | 旧代码兼容、快速调试 |
| unknown | ❌ 禁止 | ✔️ 允许 | ✔️ 安全 | 安全接收外部数据 |
| void | ❌ 禁止 | ❌ 禁止 | ✔️ 安全 | 无返回值的函数 |
| never | ✔️ 允许 | ❌ 禁止 | ✔️ 安全 | 不可达代码、类型收窄 |
void类型
void代表没有任何类型,无法直接赋值。
let a: void;
let b: number = a; // 报错将变量赋值为void并无实际意义。
若函数无返回值,可将其定义为void。
function fn():void {
console.log('今天天气不错')
}
<a href="javascript:void;" rel="external nofollow" ></a>never类型
never类型指代永不存在的值。
// 抛出异常
function error(): never {
throw new Error('我是一个Error');
}
// 死循环
function loop(): never {
while (true) {
console.log('这里是死循环')
};
}any类型
any类型代表任意类型。
let num:number = 1000;
num = "jack" // 报错
let num:any = 1000;
num = "jack" // 不报错
// 调用方法,依然不报错
num.setName('jack')尽管any不做任何约束,但极不推荐这样使用,这会带来隐患。
在开发组件、模块、定义函数或调用接口时,若类型难以定义或不明所属,可适当使用any类型。
unknown类型
unknown与any类似,所有类型均可分配给unknown,反之将unknown赋值给其它类型会报错。
// unknown 可以接收任意类型
let name:string = "jack"
let user:unknown = name;
// unknown 不可以赋值给其它类型,any除外,下面会报错
let name:unknown = "jack"
let user:string = name;总结:
- 能确定类型的,尽量定义类型。
- 无法确定类型的,可以使用 any 进行兜底。
- 当函数没有返回值时,可以使用void定义。
- any和unknown可以接收任意类型值,any可以赋值给任意类型,但unknown不可以赋值给任意类型。
void和any在项目中是比较常见的,never和unknown不常用。
常见疑问
Q:unknown 和 any 的区别?A:unknown 必须显式类型检查后才能使用,而 any 完全跳过类型安全。
Q:函数声明返回 void 却返回了值会怎样?A:TypeScript 不会报错,但这是逻辑矛盾,建议保持声明与实际一致。
Q:什么时候必须用 never?A:当函数永远不会正常返回时(如无限循环),或用于类型收窄的兜底检查。
到此这篇关于TypeScript中void、never、any、unknown类型的区别小结的文章就介绍到这了,更多相关TypeScript void、never、any、unknown内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!