DevToolBox免费
博客

TypeScript 转 JavaScript:完整转换指南

12 分钟作者 DevToolBox

TypeScript 转换为 JavaScript 是发布 npm 包、支持旧环境或从生产包中移除类型开销时的常见任务。本指南涵盖 TypeScript 编译器(tsc)、Babel、esbuild、在线转换工具、枚举处理、项目迁移策略和最佳实践。

试用我们免费的在线 TypeScript 转 JavaScript 转换器。

为什么要将 TypeScript 转换为 JavaScript?

TypeScript 是 JavaScript 的超集,添加了静态类型检查、接口、枚举、泛型等特性。但浏览器和 Node.js 运行时执行的是 JavaScript,每个 TypeScript 文件必须编译为 JavaScript 才能运行。

常见的 TS 转 JS 场景包括:发布必须在纯 JavaScript 项目中工作的 npm 库、部署到不原生支持 TypeScript 的环境、调试编译输出、从遗留项目中迁移 TypeScript、以及简化小脚本的构建复杂度。

理解转换过程中的变化有助于编写更好的 TypeScript。类型注解、接口、类型别名和 declare 块会被完全擦除。枚举、装饰器、类字段和命名空间声明会生成运行时 JavaScript 代码。

被移除的内容:类型 vs 运行时代码

转换 TypeScript 到 JavaScript 时,理解哪些特性被擦除、哪些生成运行时代码至关重要:

TypeScript 特性擦除?JavaScript 输出
类型注解完全移除
接口完全移除
类型别名完全移除
泛型完全移除
枚举生成 IIFE 或对象
const 枚举视情况默认内联到使用处
装饰器生成装饰器调用代码
命名空间生成 IIFE

TypeScript 转 JavaScript 的方法

方法 1:TypeScript 编译器(tsc)

官方 TypeScript 编译器是最可靠的转换方式,在生成 JavaScript 前执行完整的类型检查:

# Install TypeScript
npm install -D typescript

# Create tsconfig.json
npx tsc --init

# tsconfig.json key settings for conversion
{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "outDir": "./dist",
    "rootDir": "./src",
    "declaration": true,       // Generate .d.ts files
    "sourceMap": true,          // Generate source maps
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true
  },
  "include": ["src/**/*"]
}

# Compile single file
npx tsc src/app.ts --outDir dist

# Compile entire project
npx tsc

# Type-check only (no output)
npx tsc --noEmit

方法 2:Babel + @babel/preset-typescript

Babel 在不执行类型检查的情况下去除 TypeScript 类型,构建速度更快:

# Install Babel with TypeScript preset
npm install -D @babel/core @babel/cli @babel/preset-typescript

# babel.config.json
{
  "presets": ["@babel/preset-typescript"]
}

# Compile a single file
npx babel src/app.ts --out-file dist/app.js --extensions ".ts,.tsx"

# Compile entire directory
npx babel src --out-dir dist --extensions ".ts,.tsx"

# Note: Babel does NOT type-check!
# Run tsc separately for type safety:
npx tsc --noEmit && npx babel src --out-dir dist --extensions ".ts,.tsx"

方法 3:esbuild(最快)

esbuild 是用 Go 编写的极速 JavaScript 打包工具,原生支持 TypeScript:

# Install esbuild
npm install -D esbuild

# Bundle a TypeScript entry point to JavaScript
npx esbuild src/app.ts --bundle --outfile=dist/app.js --platform=node

# Transpile without bundling (preserves module structure)
npx esbuild src/**/*.ts --outdir=dist --format=esm

# Watch mode for development
npx esbuild src/app.ts --bundle --outfile=dist/app.js --watch

# Build with minification for production
npx esbuild src/app.ts --bundle --minify --outfile=dist/app.min.js

方法 4:在线转换器

对于快速的一次性转换,在线转换器让你粘贴 TypeScript 代码并立即查看 JavaScript 输出。

在 JavaScript 中处理 TypeScript 枚举

TypeScript 枚举是少数几个生成运行时 JavaScript 代码的 TypeScript 特性之一:

// === TypeScript: Numeric enum ===
enum Direction {
  Up,      // 0
  Down,    // 1
  Left,    // 2
  Right    // 3
}

// === Compiled JavaScript ===
var Direction;
(function (Direction) {
    Direction[Direction["Up"] = 0] = "Up";
    Direction[Direction["Down"] = 1] = "Down";
    Direction[Direction["Left"] = 2] = "Left";
    Direction[Direction["Right"] = 3] = "Right";
})(Direction || (Direction = {}));
// Direction[0] === "Up"   (reverse lookup)
// Direction.Up === 0      (forward lookup)

// === TypeScript: String enum ===
enum Color {
  Red = "#FF0000",
  Green = "#00FF00",
  Blue = "#0000FF"
}

// === Compiled JavaScript ===
var Color;
(function (Color) {
    Color["Red"] = "#FF0000";
    Color["Green"] = "#00FF00";
    Color["Blue"] = "#0000FF";
})(Color || (Color = {}));
// No reverse mapping for string enums

// === TypeScript: const enum (inlined) ===
const enum Status {
  Active = "ACTIVE",
  Inactive = "INACTIVE"
}
const s = Status.Active;

// === Compiled JavaScript (const enum is inlined) ===
const s = "ACTIVE"; // enum declaration removed entirely

数字枚举编译为 IIFE,创建双向映射对象。

字符串枚举编译为简单的正向映射对象。

const 枚举默认在使用处内联,声明被完全移除。使用 --preserveConstEnums 保留运行时对象。

保持运行时行为

转换时某些模式需要特别注意以保持正确的运行时行为:

可选链和空值合并?.?? 是标准 JavaScript(ES2020)。

参数属性constructor(public name: string) 生成构造函数中的赋值语句。

// === TypeScript: Parameter properties ===
class User {
  constructor(
    public name: string,
    private age: number,
    readonly id: string
  ) {}
}

// === Compiled JavaScript ===
class User {
  constructor(name, age, id) {
    this.name = name;
    this.age = age;
    this.id = id;
  }
}

// === TypeScript: import type (always erased) ===
import type { UserType } from './types';  // Erased completely
import { createUser } from './utils';     // Kept (runtime value)

导入擦除:TypeScript 自动移除仅用作类型的导入。使用 import type 明确标记。

项目迁移:TypeScript 到 JavaScript

将整个项目从 TypeScript 迁移到 JavaScript 是一项较大的工作:

  1. 使用 tsc --declaration 生成 .js 和 .d.ts 文件。
  2. 验证输出:对编译后的 JavaScript 运行测试套件。
  3. 替换源文件:用编译的 .js 文件替换 .ts 文件。
  4. 更新构建工具:移除 TypeScript 依赖。
  5. 添加 JSDoc 注解:使用 JSDoc 和 @ts-check 获得 IDE 支持。

TypeScript 转 JavaScript 最佳实践

用 tsc 保证正确性,用 esbuild 提升速度:CI 中运行 tsc --noEmit 进行类型检查,开发中使用 esbuild 快速构建。

设置正确的 target:tsconfig.json 中的 target 决定输出的 JavaScript 版本。

使用 module: "ESNext" 支持 tree shaking

使用 import type 处理仅类型导入

谨慎使用枚举:考虑用联合类型替代枚举,联合类型会被完全擦除。

测试编译输出:始终对编译后的 JavaScript 运行测试。

使用 source maps:启用 sourceMap: true 以便调试。

相关工具:JSON 转 TypeScriptJSON 格式化器Diff 比较器

TypeScript to JavaScriptJSON to TypeScriptJSON FormatterDiff Checker

常见问题

可以在线将 TypeScript 转换为 JavaScript 吗?

可以。我们的免费在线工具支持所有 TypeScript 特性,包括泛型、枚举、接口、类型别名和装饰器,无需安装任何工具。

tsc、Babel 和 esbuild 有什么区别?

tsc 是官方编译器,执行完整类型检查,最正确但最慢。Babel 去除类型不检查,更快。esbuild 用 Go 编写,是最快的选择(比 tsc 快 10-100 倍),也不检查类型。

接口和类型别名转换后会怎样?

接口和类型别名在编译时被完全擦除,不生成任何 JavaScript 输出。只有枚举、装饰器和命名空间声明会产生 JavaScript 代码。

TypeScript 枚举如何编译为 JavaScript?

数字枚举编译为双向映射对象的 IIFE。字符串枚举编译为正向映射对象。const 枚举的值在使用处内联。

应该将现有 TypeScript 项目转换为 JavaScript 吗?

大多数情况下不建议。TypeScript 为代码质量和重构安全性提供重大好处。仅在项目很小、团队无 TypeScript 经验或需要发布预编译库时考虑转换。

理解什么被擦除(类型、接口、别名)和什么生成运行时代码(枚举、装饰器、命名空间)后,TypeScript 到 JavaScript 的转换就很简单。使用 tsc 保证正确性,esbuild 提升速度,在线转换器处理快速任务。

使用我们的免费在线工具即时将 TypeScript 转换为 JavaScript。

Related Developer Tools and Guides

𝕏 Twitterin LinkedIn
这篇文章有帮助吗?

保持更新

获取每周开发技巧和新工具通知。

无垃圾邮件,随时退订。

试试这些相关工具

JSTypeScript to JavaScript{ }JSON Formatter

相关文章

TypeScript vs JavaScript:何时使用哪个

TypeScript 和 JavaScript 的实用对比。类型安全、代码示例、迁移策略、性能、生态系统和选择指南。

TypeScript 泛型完全指南 2026:从基础到高级模式

全面掌握 TypeScript 泛型:类型参数、约束、条件类型、映射类型、工具类型,以及事件发射器和 API 客户端等实战模式。

TypeScript 工具类型速查表:Partial、Pick、Omit 等

TypeScript 工具类型完整参考与实际示例。学习 Partial、Required、Pick、Omit、Record、Exclude、Extract、ReturnType 和高级模式。