TypeScript vs JavaScript

TypeScript 与 JavaScript 常被拿来比较,实际上二者并非竞争对手:TS 是 JS 的超集,最终都要编译成 JS 运行。真正的差别在于类型系统带来的开发体验与可靠性。本节从多个维度对比。

核心差异速览

对比项JavaScriptTypeScript
类型系统动态类型,运行时才确定静态类型,编译期检查
类型错误发现运行时编译时
是否可直接运行否,需先编译
额外语法类型注解、接口、枚举、泛型
学习成本中等,需额外学类型
适用项目小脚本、原型中大型、多人协作

语法上的差别

JS 写法在 TS 中全部合法,TS 只是「额外允许」写类型:

// JavaScript 写法(TS 完全兼容)
let count = 1;
count = 2;

// TypeScript 写法(多了类型注解)
let total: number = 1;
total = 2;
// total = "3"; // 编译报错:string 不能赋给 number

错误发现时机不同

JS 的错误要等运行到那一行才暴露;TS 在编译时就能拦截:

// app.js —— JavaScript 写法
function add(a, b) {
    return a + b;
}
add("1", 2); // 运行后得到 "12",字符串拼接,非预期
// app.ts —— TypeScript 写法
function add(a: number, b: number): number {
    return a + b;
}
add("1", 2); // 编译报错:string 不能赋给 number 参数

运行时行为完全一致

类型在编译后会被擦除,最终产出的 JS 与手写 JS 行为相同:

// app.ts 编译产物示意
function add(a, b) {
    return a + b;
}

因此 TS 不会带来运行时性能损失,也没有"TS 运行时"。

何时选择 JS

  • 临时脚本、一次性工具、快速原型。
  • 团队尚未熟悉类型语法,追求最低上手成本。
  • 必须避免任何构建步骤的极简页面。

何时选择 TS

  • 长期维护的中大型项目,需要约束与重构保障。
  • 团队协作时,接口类型即契约,沟通成本更低。
  • 前后端同构或框架项目(React/Vue/Angular 官方支持)。
  • 公共库开发,编译时自动生成 .d.ts 声明。

迁移可能性

已有 JS 项目可以渐进迁移:开启 allowJs 混用,逐个文件改后缀 .ts,由浅入深补充类型,无需推倒重来。

小结

JS 灵活轻快、随处可跑;TS 严谨可靠、把错误挡在编译期。两者不是替代关系,而是同一生态的两种选择——小脚本用 JS,大型工程用 TS 已是业界主流共识。

笔记加载中…