TypeScript中void、never、any、unknown类型的区别小结
作者:汐语W
本文主要介绍了TypeScript中void、never、any、unknown类型的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
