@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/
但是在编辑器中会报错:
原因:@types/node 对es api的定义使用的是es2020(所有版本都是这个值):
这个时候就要去 tsconfig.json 中修改 target 和 lib 字段,来告诉编辑器支持哪个版本的es语法。但一般人并不知道node22这个版本支持了哪些es特性。
好在社区维护了一组 baseline:github.com/tsconfig/ba… 如果是node22版本,只需要安装@tsconfig/node22,然后在 tsconfig.json 中加入:
"extends": "@tsconfig/node22/tsconfig.json"
这么一来,上面的错误就解决了!
还有问题
其实并没有完全解决问题,比如下面这个在编辑器会报错:
运行没问题。
这是因为上面的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版本有关系,可能不支持)
- 手动在项目中添加类型定义