DevToolBox免费
博客

TypeScript vs JavaScript:何时以及如何转换

11 分钟阅读作者 DevToolBox

TypeScript 已成为新 JavaScript 项目的默认选择,但仍有数百万行 JS 代码在生产环境中运行。本指南涵盖关键差异、何时选择哪种语言以及如何迁移——包括 TypeScript 编译为 JavaScript 时实际发生了什么。

即时将 TypeScript 转换为 JavaScript →

1. TypeScript 与 JavaScript:关键差异

TypeScript 是 JavaScript 的严格语法超集。每个有效的 JS 文件已经是有效的 TS。TypeScript 添加了一个可选的静态类型系统,在编译时而非运行时捕获错误。

特性JavaScriptTypeScript
Type SystemDynamic (runtime)Static (compile-time)
Type AnnotationsNone (JSDoc optional)Built-in syntax
CompilationNot requiredRequired (tsc, esbuild, swc)
IDE SupportGoodExcellent (autocomplete, errors)
Learning CurveLowerModerate (types take time)
Runtime OutputRuns as-isCompiles to JavaScript

关键见解:TypeScript 类型仅存在于编译时。编译后,所有类型注解都会被删除,留下的是标准 JavaScript。运行时零开销。

2. 何时使用哪种

选择 TypeScript 的情况:

  • 项目超过几百行代码
  • 多个开发者在同一代码库工作
  • 构建供他人使用的库或 API
  • 想要更好的 IDE 支持(自动完成、重构)
  • 项目将长期维护

选择 JavaScript 的情况:

  • 快速原型或脚本(200 行以下)
  • 简单的 serverless 函数或小工具
  • 团队没有 TypeScript 经验且截止日期紧迫
  • 配置文件和构建脚本
  • 需要最大生态系统兼容性(某些旧工具对 TS 支持不佳)

总结:对于任何维护超过一个月的项目,TypeScript 通过减少 bug 和提高重构信心来回报投入。

3. 渐进式迁移策略

不必一次性转换整个项目。TypeScript 支持渐进式采用

  1. 第 1 步:添加 tsconfig.json,设置 "allowJs": true"strict": false
  2. 第 2 步:逐个将文件从 .js 重命名为 .ts
  3. 第 3 步:为重命名的文件添加类型,从公共 API 开始
  4. 第 4 步:逐步启用更严格的编译器选项
  5. 第 5 步:当大多数文件转换完成后启用 "strict": true

这种方法让您在逐步提高类型安全性的同时继续交付功能。

专业提示:从共享工具函数和数据模型开始添加类型。这些提供最大价值,因为它们在整个代码库中被导入。

4. TypeScript 编译为什么

理解 TypeScript 编译器输出可以揭开整个系统的神秘面纱。以下是常见 TS 特性的编译结果:

类型注解被简单删除:

// TypeScript
function greet(name: string, age: number): string {
  return `Hello ${name}, you are ${age}`;
}

// Compiled JavaScript
function greet(name, age) {
  return `Hello ${name}, you are ${age}`;
}

接口和类型别名被完全擦除——不会产生任何 JavaScript 输出:

// TypeScript
interface User {
  id: number;
  name: string;
  email: string;
}
type Status = 'active' | 'inactive';

// Compiled JavaScript
// (nothing — both are completely erased)

枚举是少数会产生运行时代码的 TS 特性之一:

// TypeScript
enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT",
}

// Compiled JavaScript
var Direction;
(function (Direction) {
  Direction["Up"] = "UP";
  Direction["Down"] = "DOWN";
  Direction["Left"] = "LEFT";
  Direction["Right"] = "RIGHT";
})(Direction || (Direction = {}));

5. 编译时删除的常见 TypeScript 语法

这些仅属于 TypeScript 的构造在编译时被完全剔除,不会产生 JavaScript 输出:

  • type 别名 — type User = {{ name: string }}
  • interface 声明 — interface Props {{ title: string }}
  • 类型注解 — const x: number = 5 变为 const x = 5
  • 泛型类型参数 — function identity<T>(x: T) 变为 function identity(x)
  • as 类型断言 — value as string 变为 value
  • ! 非空断言 — element!.click() 变为 element.click()
  • declare 块 — 外部代码的环境声明

重要:某些 TS 特性如 enumnamespace 和参数装饰器产生运行时 JavaScript。这些是例外而非规则。

6. 项目设置技巧

无论是从零开始还是迁移,以下 tsconfig.json 设置值得推荐:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,
    "noUncheckedIndexedAccess": true,
    "forceConsistentCasingInFileNames": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "isolatedModules": true
  }
}

关键设置说明:

  • "strict": true — 启用所有严格类型检查(使用 TS 的核心目的)
  • "noUncheckedIndexedAccess": true — 数组和对象索引访问返回 T | undefined
  • "forceConsistentCasingInFileNames" — 防止在区分大小写的文件系统(Linux)上出现 bug
  • "skipLibCheck": true — 跳过 node_modules 类型检查以加快构建

对于 Next.js、Vite 和其他框架,框架默认的 tsconfig.json 通常是很好的起点。只自定义您需要的部分。

7. 工具推荐:TypeScript 转 JavaScript 转换器

需要快速查看 TypeScript 编译结果,或为纯 JS 项目转换 TS 代码片段?我们的 TypeScript 转 JavaScript 转换器即时处理:

  • 剔除所有类型注解、接口和类型别名
  • 将枚举转换为 JavaScript 等效形式
  • 保留所有运行时逻辑和格式
  • 准确展示 TypeScript 编译器的输出

粘贴 TypeScript 代码,立即查看干净的 JavaScript 输出。非常适合学习、调试和与纯 JS 团队共享代码。

即时将 TypeScript 转换为 JavaScript →

常见问题

TypeScript 会让代码运行更慢吗?

不会。TypeScript 的运行时性能开销为零。所有类型信息在编译时被删除。生成的 JavaScript 运行速度与手写 JavaScript 完全相同。唯一的成本是稍微加长的构建步骤。

可以不用构建步骤直接使用 TypeScript 吗?

近期的 Node.js 版本(22.6+)支持通过 --experimental-strip-types 直接运行 TypeScript。Deno 和 Bun 原生支持 TypeScript。对于浏览器,仍然需要编译步骤,Vite 等工具会透明地处理。

应该一次性将所有 JavaScript 文件转换为 TypeScript 吗?

不应该。强烈建议渐进式迁移。从 tsconfig 中设置 "allowJs": true 开始,逐个重命名文件,逐步添加类型。一次性转换所有内容会产生一个难以审查的巨大 PR,并可能引入 bug。

Related Developer Tools and Guides

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

保持更新

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

无垃圾邮件,随时退订。

试试这些相关工具

JSTypeScript to JavaScriptTSJSON to TypeScriptGTGraphQL to TypeScript

相关文章

JSON 转 TypeScript:完整指南与示例

学习如何自动将 JSON 数据转换为 TypeScript 接口。涵盖嵌套对象、数组、可选字段和最佳实践。

TypeScript 泛型详解:从入门到实战的完整指南

从基础到高级模式掌握 TypeScript 泛型。涵盖泛型函数、接口、约束、条件类型和实际应用。

TypeScript 转 JavaScript:完整转换指南(5 种方法)

学习使用 tsc、Babel、esbuild、SWC 和在线工具将 TypeScript 转换为 JavaScript。涵盖枚举、装饰器、命名空间、JSDoc 和构建管道集成。