跳到主要内容
Deno 2.4 已发布,带来了 deno bundle、字节/文本导入、OTel 稳定版等功能
了解更多
TypeScript in Node vs. Deno

Node 刚刚添加了 TypeScript 支持。这对 Deno 意味着什么?

Node.js 在 22.6 版本中(23.6 版本稳定)最近增加了原生 TypeScript 支持,这项受欢迎的增强功能简化了 TypeScript 用户的设置。这在社区中引发了关于 Node 新功能与 Deno 现有 TypeScript 集成之间对比的疑问。

在本文中,我们将探讨 Node 的 TypeScript 支持,并与 Deno 的方法进行清晰的比较。

Node 中的 TypeScript

TypeScript 为 JavaScript 添加了类型,有助于在项目增长时更好地组织代码。它主要处理两项任务:

  1. 类型检查: 确保变量与声明的类型匹配。
  2. 类型剥离: 将 TypeScript 转译成可在浏览器和运行时执行的纯 JavaScript。

Node 22.6.0 引入了内置的 TypeScript 支持,允许通过 --experimental-strip-types 标志自动剥离类型。此功能在 Node 23.6 中稳定,可以直接执行 (node foo.ts) 而无需额外标志。

Node 的 TypeScript 支持用空格替换类型注解,生成有效的 JavaScript

// TypeScript
function sum(a: number, b: number): number {
  return a + b;
}
sum(5, 10);

// After type stripping
function sum(a        , b        )         {
  return a + b;
}
sum(5, 10);

这实质上将之前由 ts-node 提供的功能直接集成到 Node 中,简化了 TypeScript 的执行。

然而,也存在一些限制:

  • 无内置类型检查: 仍然需要 tsc 等外部工具。
  • 不支持 JSX 或 TSX: Node 支持 .ts.mts.cts,但 React (.tsx) 和 JSX 项目仍需要 esbuild、Babel 或 tsc 等外部转译器或打包工具。
  • 需要手动管理 tsconfig.json 类型检查仍依赖于通过 tsconfig.json 进行的外部配置。

以上是 Node 中 TypeScript 的概览——接下来让我们看看 Deno 如何处理这些方面。

Deno 中的 TypeScript

Deno 通过提供一个集成了完整 TypeScript 工具链的单一可执行文件来简化 Web 编程。这种方法以最少的配置提供了 TypeScript 的优势,简化了测试、格式化和编译工作流程。

Deno 的 TypeScript 集成主要包括三个部分:

  1. 执行: Google 的 V8 引擎,它直接执行 JavaScript 而不直接执行 TypeScript。
  2. 类型检查: Microsoft 的 TypeScript 编译器(用 JavaScript 实现)在内部捆绑。
  3. 类型剥离: SWC,由 Kang Dong Yoon (강동윤) 用 Rust 构建的高性能解析器,可在不运行 JavaScript 的情况下高效剥离类型。

tsconfig.json 又如何呢?

Deno 强调零配置开发,以避免配置过载。它提供了适用于大多数情况的合理默认值(详情在此)。如果需要自定义选项,您可以轻松地在 deno.json 中使用 compilerOptions 或指定您自己的 tsconfig.json

deno -c tsconfig.json main.ts

使用 deno check 在 CI 中进行类型检查

运行 deno check 可快速识别类型错误,无论是在本地还是远程环境。

deno check                 # Check local files
deno check main.ts         # Single file check
deno check jsr:@std/http/file-server # Remote module
deno check --all           # Including npm packages
deno check --doc           # Docs and code
deno check --doc-only      # Documentation only

通过 LSP 实现类型感知的工具提示、错误等

当使用 Deno 的语言服务器 (LSP) 时,特别是与 VSCode 等编辑器配合使用时,您可以获得即时、类型感知的反馈和代码检查。

Type checking in VSCode from a JSR dependency

在 VSCode 中实时检查 JSR 依赖项的类型。无需配置。

Hover tooltip displaying documentation

悬停工具提示显示文档。

deno repldeno jupyter 中的 TypeScript

您可以在 Deno 的 REPLJupyter Notebooks 中直接运行 TypeScript

$ deno
Deno 2.2.2
exit using ctrl+d, ctrl+c, or close()
REPL is running with all permissions allowed.
> const sum = function(a: number, b: number): number { return a + b };
undefined
> sum(5, 10)
15

(注意:REPL 将类型视为注释;不进行实时检查。)

无需转译即可分发 TypeScript

Deno 支持直接分发 TypeScript 模块,无需转译步骤和单独的 .d.ts 文件。

JSR 注册表利用了这一优势,实现了无缝的 TypeScript 分发,同时不影响清晰度和可读性。

import { encodeBase64 } from "jsr:@std/encoding@1";

借助 JSR,调试仍然清晰明了——堆栈跟踪和源代码导航直接链接到原始 TypeScript 代码。

TypeScript 和 npm

Deno 通过 package.jsonnpm: 说明符导入 npm 模块,并通过 .d.ts 文件提供完整的类型检查支持。对于没有类型的包,请使用 @ts-types 编译指示。

// @ts-types="npm:@types/express"
import express from "npm:express";

Deno 工具链中的 TypeScript 支持

Deno 在其整个工具链中广泛集成了 TypeScript:

  • deno fmt:格式化 TypeScript。
  • deno compile:将 TypeScript 编译为可执行文件。
  • deno doc:直接从 TypeScript 生成文档。
  • deno lint:内置 TypeScript 代码检查规则。

此外,对 .tsx.jsx 的支持使 React 或 Preact 的使用无缝衔接。

接下来是什么?

TypeScript 仍然是可维护 JavaScript 的首选语言,并持续发展。Deno 致力于通过减少样板代码和配置来简化 TypeScript 工作流程。

我们将继续增强 Deno 的 TypeScript 集成,让您能更专注于构建出色的软件,而不是繁琐的设置。

🚨️ Deno 2.2 已发布! 🚨️

等等!