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

Nodejs

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