Node 23 即将无需额外配置即可运行 TypeScript 文件

Node 23很快将无需任何额外配置就能运行TypeScript文件。
过去一年来一直致力于推动Node对TypeScript支持的马尔科·伊波利托(Marco Ippolito),在Node 23中提交了一个取消 “—experimental - strip - types” 标志的拉取请求。
实际上,这意味着以下几点:
- 你可以创建一个包含TypeScript语法(如类型注解)的index.ts文件。
- 你无需添加其他标志,直接运行node index.ts即可。
- Node将使用swc的一个版本去除类型,然后运行生成的代码。
我们把这篇文章当作常见问题解答:
我该如何尝试?
正如马尔科提到的,目前可在Node的夜间版本中体验。几天内,它很可能会在Node 23版本中发布。
更新:看起来它会在23.6.0版本中推出。
Node会对我的文件进行类型检查吗?
不会。Node在运行文件时不会对其进行类型检查。这是件好事,意味着类型检查可以与运行应用程序的进程分开进行。
你需要在本地运行tsc —watch,以便在编写代码时对应用程序进行类型检查。
我的tsconfig.json应该包含哪些内容?
这是我定制版的TSConfig速查表。
{
"compilerOptions": {
/* 基本选项: */
"esModuleInterop": true,
"skipLibCheck": true,
"target": "es2022",
"allowJs": true,
"resolveJsonModule": true,
"moduleDetection": "强制",
"isolatedModules": true,
"verbatimModuleSyntax": true,
/* 严格性设置 */
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
/* 与Node相关设置 */
"allowImportingTsExtensions": true,
"module": "NodeNext",
"noEmit": true,
/* 如果你的代码不在DOM中运行: */
"lib": [
"es2022"
]
}
}
在TypeScript 5.8中,这种情况可能会改变,TypeScript团队计划推出一个兼容性标志。目前还不确定具体内容,但它会让与Node的TypeScript支持的互操作性变得更简单。
枚举(Enums)和命名空间(Namespaces)受支持吗?
默认情况下,枚举和命名空间不受支持。你可以在这里查看其他不受支持的特性。如果你想支持其他TypeScript特性,可以添加 —experimental - transform - types来实现。
就我个人而言,对此并不太在意,尤其是枚举。
请注意,运行时命名空间不受支持,但仅类型命名空间(使用declare namespace)受支持。这很不错,我喜欢仅类型命名空间。
生产环境中我需要将代码转译为JavaScript吗?
- Node应用
- 如果你将代码部署到无服务器平台,那么需要。转译和压缩代码对于实现良好的冷启动至关重要。
- 如果你部署到冷启动影响较小的地方,那么可能不需要!应用程序最初加载TypeScript代码时会有一点开销(确实很小),但一旦进程运行起来,不太可能导致速度减慢。
- 一种可能的情况是,如果你的代码在处理过程中动态加载其他TypeScript文件,我认为这可能会导致一些额外的速度减慢,所以要谨慎处理。
- 库
是的,在将TypeScript代码发布到NPM之前,你仍然需要将其转译为JavaScript。原因有两点:
- 这样JavaScript用户仍然可以使用你的库。
- TypeScript在使用声明文件(.d.ts文件)时运行速度更快,所以不发布这些文件会使你的用户的TypeScript体验变慢。
- 单体仓库(Monorepos) 如果你在单体仓库中创建一个仅供该单体仓库使用的库,我仍然建议将TypeScript文件转译为JavaScript。
原因与库的情况相同——单体仓库中的.d.ts文件越多,你的TypeScript使用体验就会越快。
这个功能会应用到Node的旧版本上吗?
会的,Node 22将支持TypeScript,但Node 20不会。
Publish on 2025-01-08,Update on 2025-02-10