发布于 2026-01-06 1 阅读
0

TypeScript 数据类型简介(第一部分):void、null、undefined、never、object

TypeScript 数据类型简介(第一部分)

空白

无效的

不明确的

绝不

目的

立即订阅我的邮件列表:http: //jauyeung.net/subscribe/

请在Twitter上关注我:https://twitter.com/AuMayeung

更多文章请访问https://medium.com/@hohanga

更多文章请访问http://thewebdev.info/

JavaScript 和其他编程语言一样,有自己的数据结构和类型。

要用 JavaScript 编写程序,我们需要了解一些数据类型。不同的数据片段可以组合起来,构建更复杂的数据结构。

JavaScript 是一种弱类型语言,或者说是动态类型语言。这意味着,一个用一种类型声明的变量,无需显式地将数据转换为另一种类型,就可以转换为另一种类型。

变量可以随时包含任何类型的值,具体取决于赋值的内容。在动态类型语言中,如果不记录日志,很难确定变量的类型,因此我们可能会将一些我们不希望的数据赋值给变量。

TypeScript 通过允许我们为变量设置固定类型来解决这些问题,从而确保类型正确。在本文中,我们将探讨 `type` void`type`、null` type` 和 ` type` 类型。undefinedneverobject


空白

这种void类型几乎与另any一种类型完全相反。它表示没有任何类型。因此,这种类型的变量只有在运行 TypeScript 编译器时未指定该设置,或者可以将其设置为 时,void才能具有该值null--strictNullChecksundefined

因此,直接给变量赋值void意义不大。它更多用于指定函数的返回数据类型。具有void返回类型的函数不会返回任何值。

例如,我们可以void像下面的代码一样,对变量进行无意义的赋值:

let useless: void = undefined;

我们可以通过编写以下代码来设置箭头函数的返回类型void

const voidFn = (): void => {  
  console.log("Void function returns nothing");  
}
voidFn();

或者,我们可以将返回类型设置void为传统函数,如下面的代码所示:

function voidFn(): void {  
  console.log("Void function returns nothing");  
}
voidFn();

两个函数调用都会输出函数内部语句的内容Void function returns nothingconsole.log


无效的

null类型表示只能取值的变量nullnull表示该变量没有值。

所以,再次强调,给它赋值几乎毫无意义。我们只能给null具有该变量类型的变量赋值null--strictNullChecks在运行 TypeScript 编译器时设置了相应的标志后,该变量null只能赋值给具有该any类型和该null类型的变量。

它的优势在于,我们可以使用联合类型,让变量可以接收来自多个变量的值。

然后,我们可以指定一些有用的信息以及null类型。这与 JavaScript 不同,因为 JavaScript 中值本身就是类型,而 JavaScript 中值本身null就是类型object,这主要null是历史原因造成的。


不明确的

这种undefined类型代表一个只能取特定值的变量undefined。因此,再次强调,给它赋值是毫无意义的。

我们只能将值赋给undefined具有该变量的变量nullundefined只能将值赋给具有该any类型和该undefined类型的变量。

它的优势在于,我们可以使用联合类型,让变量可以接收来自多个变量的值。

然后,我们可以在类型之外指定一些有用的信息undefined。类型本身实际上没什么用,所以我们应该不会经常看到只有类型的变量undefined


绝不

这种never类型表示永远不会发生的事情。例如,void它可以用来指定一个函数永远不会返回任何值。

该类型是任何其他类型的子类型,并且可以赋值给任何其他类型。但是,除了其他变量之外never,没有任何类型是该类型的子类型,也不能赋值给该类型nevernever

具有返回类型的函数never必须始终有一个不可达的端点。例如,我们可以编写一个具有无限循环且never返回类型如下的函数:

function infiniteFn(): never {  
  while (true) {  
  }  
}

抛出异常的函数也可以有never返回类型,如下例所示:

function errorFn(message: string): never {  
  throw new Error(message);  
}
errorFn('Error occurred');

目的

object类型表示非原始对象。也就是说,任何不是 `int` numberstring` int` boolean、 `int` bigint、 `int` symbolnull`int` 或`int` 的对象undefined

它主要用于Object标准库中对象的类型定义,以及其他不希望将原始值赋给对象或传递给函数的代码片段。

例如,在Object.create方法的类型定义中,我们可以看到参数的类型被设置为object如下代码所示的类型:

create(o: object | null): any;

setPrototypeOf同样地,在同一类型声明的方法签名中,我们看到proto参数(即接受对象原型的参数)也object设置了类型,如下所示:

setPrototypeOf(o: any, proto: object | null): any;

这样一来,我们就不能在 TypeScript 中将原始值作为参数传递给这些方法。否则,就会报错。所以,如果我们的 TypeScript 文件中包含以下代码,那么它们就能被编译并运行:

const obj1 = Object.create({});      
const obj2 = Object.create(null);  
console.log(obj1);  
console.log(obj2);

两条语句都会返回一个空对象console.log

唯一的区别在于,这obj2是一个纯对象,这意味着它不继承任何原型。像下面的代码那样向方法传递原始值create会导致编译失败:

Object.create(42);   
Object.create("abc");   
Object.create(false);  
Object.create(undefined)

上面的代码Argument of type ‘42’ is not assignable to parameter of type ‘object | null’对于第一个问题会报错,Argument of type ‘abc’ is not assignable to parameter of type ‘object | null’对于第二个问题则会报错。

第三行会让我们出局Argument of type ‘false’ is not assignable to parameter of type ‘object | null’,最后一行也会让我们出局Argument of type ‘undefined’ is not assignable to parameter of type ‘object | null’

编译会失败,代码无法运行。

此外,我们还可以用它来防止将原始值赋给它。例如,如果我们这样写:

let x: object = {};

这样,上面的代码就可以编译并运行。但是,如果我们改写成以下代码:

let x: object = 1;

然后我们得到,并且由于是一个原始值,Type ‘1’ is not assignable to type ‘object’因此该代码无法使用 TypeScript 编译器进行编译和运行。1

这种void类型几乎与另any一种类型完全相反。它表示没有任何类型。因此,这种类型的变量只有在运行 TypeScript 编译器时未指定该设置,或者可以将其设置为 时,void才能具有该值null--strictNullChecksundefined

它适用于声明不返回任何值且功能简单的函数。null类型变量只能接受该null值。undefined类型只能被赋值undefined

object类型表示非原始对象。也就是说,任何不是 `int` numberstring` int` boolean、 `int` bigint、 `int` symbolnull`int` 或`int` 的对象undefined

它主要用于Object标准库中对象的类型定义,以及其他不希望将原始值赋给对象或传递给函数的代码片段。

文章来源:https://dev.to/aumayeung/introduction-to-typescript-data-types-part-1-439o