TypeScript vs JavaScript
TypeScript 与 JavaScript 常被拿来比较,实际上二者并非竞争对手:TS 是 JS 的超集,最终都要编译成 JS 运行。真正的差别在于类型系统带来的开发体验与可靠性。本节从多个维度对比。
核心差异速览
| 对比项 | JavaScript | TypeScript |
|---|---|---|
| 类型系统 | 动态类型,运行时才确定 | 静态类型,编译期检查 |
| 类型错误发现 | 运行时 | 编译时 |
| 是否可直接运行 | 是 | 否,需先编译 |
| 额外语法 | 无 | 类型注解、接口、枚举、泛型 |
| 学习成本 | 低 | 中等,需额外学类型 |
| 适用项目 | 小脚本、原型 | 中大型、多人协作 |
语法上的差别
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 已是业界主流共识。