TypeScript中unknown、never、void与any类型的核心区别解析

作者:小括号

时间:2026-10-30

浏览:213

本文深入解析TypeScript中四种特殊类型的区别:unknown表示未知类型,所有值可赋值给它但需类型收窄后才能使用;never代表永不存在的值,常用于抛出异常或死循环的函数返回;void表示函数无返回值,仅能赋undefined或null;any则跳过类型检查,允许任意操作。掌握这些类型的特性有助于编写更安全的TypeScript代码。

文章目录

一 unknown: 未知类型

unknown类型是TypeScript 3.0版本引入的新特性,用于表示类型未知的变量。

1.1 所有类型的字面量都可以分配给unknown类型

unknown类型代表变量类型未知,即可能为任意类型。因此,所有类型的字面量都可以赋值给unknown类型的变量。例如,声明一个unknown类型的变量后,先后为其赋值字符串、数字和对象类型的字面量,这些赋值操作均可成功执行。

let notSure: unknown = 'sisterAn!'
// 可以被赋值任意类型
notSure = 'sisterAn!'
notSure = 512
notSure = { hello: () => 'Hello sisterAn!' }

1.2 unknown 类型不允许给 any 或 unknown 以外的变量赋值

由于unknown类型的变量类型未知,无法直接赋值给具体类型的变量。也就是说,unknown类型的变量不允许赋值给any或unknown以外的其他类型变量。

两个未知变量之间可以相互赋值

let notSure: unknown = 2
let notSure1: unknown = 'Hello'
notSure = notSure1

unknown类型的变量与any类型的变量之间可以相互赋值。

let notSure: unknown = 2
let any1: any = 12
notSure = any1
any1 = notSure

unknown类型的变量不能直接赋值给其他具体类型的变量。

let notSure: unknown = 2
let num: number = 12
notSure = num
any1 = notSure
num = notSure // error: Type 'unknown' is not assignable to type 'number'.

1.3 unknown 类型变量不可以执行具体类型的方法

即使unknown类型的变量在运行时确实是某种具体类型,也不能直接调用该类型的方法,除非使用类型断言或类型守卫进行类型收窄。

let notSure: unknown = 'sisterAn'
let num: number = 12
notSure = num
notSure.toLowerCase()
// error: Object is of type 'unknown'.

二 never:永不存在的值

never类型表示那些永不存在的值的类型。

2.1 never:执行中断的函数返回值类型

never类型通常用于表示函数没有正常返回值的场景,即函数执行过程中因异常或死循环等原因导致程序无法到达返回值语句。

例如,抛出异常的函数会直接中断程序运行,导致程序无法执行到返回值语句,因此其返回值为never类型。

function error(msg: string): never {
    throw new Error(msg);
} 

另一个例子是死循环,程序永远无法运行到函数返回值语句,因此返回值类型也为never。

function loopForever(): never {
    while (true) {};
}

2.2 never可以赋值给任何类型,但是不能被赋值

never类型是任何类型的子类型,可以赋值给任何类型;然而,除了never本身外,没有类型是never的子类型或可以赋值给never类型,包括any类型也不能赋值给never。

三 void:函数无返回值

void类型表示函数没有返回值,或者返回undefined。

function a(): number { // ERROR: 其声明类型不为 "void" 或 "any" 的函数必须返回值
  console.log(123)
}
function a(): void {
  console.log(123)
}

对于void类型的变量,只能赋予undefined和null值。

let a: void = 1 // ERROR: 不能将类型“number”分配给类型“void”
let a: void = undefined

四 any:在编译时可选择地包含或移除类型检查

any类型实际上跳过了类型检查过程,允许赋予任意值并调用任意方法。相比之下,Object类型的变量虽然可以赋予任意值,但不能在其上调用任意方法。

到此这篇关于详细聊聊TypeScript中any unknown never和void的区别的文章就介绍到这了,更多相关ypeScript中any unknown never和void区别内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章