@types/node 最佳使用指南

1,374 阅读2分钟

@types/node 提供了node的ts类型定义,基本上可以分为:

  • 对es语法规范的定义
  • 对内置库比如fs、http的定义

关于版本

node有很多版本,目前最新的是node22,每个版本的api有差别,对应的ts定义肯定也要差别。 @types/node版本与node版本的对应关系:基本上只要安装同一个大版本的@type/node即可,比如node16就安装@types/node 16,贴一个链接参考:github.com/DefinitelyT…

问题

只使用@type/node是不够的,举个例子:我的node版本是22,安装了同版本的@types/node,下面的程序运行没有问题:

var a = [12, 3];
var b = a.findLast(function (item) { return item === 3; });
console.log('b', b);

因为 node22 确实支持了 findLast。可以在这个平台看node支持的es特性:node.green/

但是在编辑器中会报错:

image.png

原因:@types/node 对es api的定义使用的是es2020(所有版本都是这个值):

image.png

这个时候就要去 tsconfig.json 中修改 target 和 lib 字段,来告诉编辑器支持哪个版本的es语法。但一般人并不知道node22这个版本支持了哪些es特性。

好在社区维护了一组 baseline:github.com/tsconfig/ba… 如果是node22版本,只需要安装@tsconfig/node22,然后在 tsconfig.json 中加入:

"extends": "@tsconfig/node22/tsconfig.json"

这么一来,上面的错误就解决了!

还有问题

其实并没有完全解决问题,比如下面这个在编辑器会报错:

image.png

运行没问题。

这是因为上面的transfer是es2024的特性。我们上面继承的配置 @tsconfig/node22,详细定义如下:

{
  "$schema": "https://json.schemastore.org/tsconfig",
  "_version": "22.0.0",

  "compilerOptions": {
    "lib": ["es2023"],
    "module": "node16",
    "target": "es2022",

    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "moduleResolution": "node16"
  }
}

可以看到它只使用 es2023 这个lib。 why?因为node22基本完全支持es2023,所以将baseline定成了es2023,但实际上node22还支持部分es2024的特性。 这部分的特性,就需要我们按需在项目中添加了。两种方法:

  • 在tsconfig.json的lib中添加(api与typescript版本有关系,可能不支持)
  • 手动在项目中添加类型定义