说说 TypeScript 与 JavaScript 的区别
下文默认基于 TypeScript 5.x 与现代 JavaScript(ES2023+)语境。
面试速答(30 秒版 TL;DR)
- TypeScript(TS)是 JavaScript(JS)的超集,任何合法 JS 基本都可以当 TS 写。
- 最大区别不是语法糖,而是:TypeScript 多了一套静态类型系统和编译期工具链。
- JavaScript 关注运行时执行;TypeScript 额外关注:
- 编译期类型检查;
- IDE 智能提示;
- 重构安全;
- 大型工程可维护性。
- 但要注意:
- TypeScript 不会改变 JS 运行时本质;
- 类型信息默认只存在编译期,最终运行的仍然是 JavaScript。
心智模型:TS 是“给 JS 加了一层编译期约束”
这张图对应的面试结论是:
- JS 可以直接运行;
- TS 要先经过编译阶段;
- TS 的主要增益发生在“运行之前”。
1. 类型系统:最核心差异
JavaScript 是动态类型语言:
let value = "hello";
value = 123;
value = { ok: true };
TypeScript 会额外检查类型关系:
let value: string = "hello";
value = 123; // 报错
这带来的收益是:
- 更早暴露错误;
- 减少“调用方和实现方理解不一致”;
- 重构时更容易发现受影响点。
2. 语法层面:TS 比 JS 多了哪些东西
TypeScript 常见新增内容包括:
- 类型注解:
name: string - 接口:
interface - 类型别名:
type - 泛型:
<T> - 枚举:
enum - 条件类型、映射类型、工具类型
as断言、satisfies、类型守卫等
但这些新增内容里,很多都只是编译期语法,最终不会原样出现在运行时代码里。
3. 运行时层面:TS 并没有创造新的执行模型
这是很容易答偏的一点。
要明确说:
- TS 不会改变 JS 的事件循环、原型链、闭包、this 绑定规则;
- TS 也不会自动帮你做运行时数据校验;
- 编译通过不代表运行时绝对安全。
例如:
type User = {
name: string;
};
const user = JSON.parse("{}") as User;
console.log(user.name.toUpperCase());
这里依然可能在运行时报错,因为:
as User只骗过了编译器;- 运行时对象并没有真的被验证成
User。
4. 工程层面:为什么大项目更偏向 TS
TypeScript 的真正价值通常出现在中大型项目里:
- API 契约更清晰;
- 模块边界更明确;
- 重构更可控;
- IDE 自动补全和跳转更准;
- 新人接手时更容易理解数据结构。
所以面试里不要只答“TS 能防止类型错误”,更完整的说法是:
- TS 提升的是大型工程协作效率和变更安全性。
5. JS 有而 TS 没有的误解,TS 有而 JS 没有的现实
5.1 误解:TS 比 JS 跑得快
通常不能这样说。
因为真正跑起来的是编译后的 JavaScript,性能主要看:
- 生成代码质量;
- 运行时环境;
- 具体实现逻辑。
TS 本身不是性能优化器。
5.2 现实:TS 有编译成本
引入 TS 以后会多出:
- 类型设计成本;
- 编译时间;
- 第三方库类型兼容问题;
- 团队规范约束成本。
所以 TS 不是“零代价升级”,而是用一些学习和维护成本,换更强的工程可控性。
6. 高频面试题标准答法
6.1 TypeScript 是不是一门新语言
可以说是“建立在 JavaScript 之上的语言层”,但本质上它最终还是编译成 JavaScript 运行。
6.2 TypeScript 能不能代替运行时校验
不能。
编译期类型安全和运行时数据可信度是两件事。
6.3 什么时候不一定要上 TypeScript
下面这些场景,收益可能没那么大:
- 很小的脚本;
- 生命周期很短的实验代码;
- 团队成员都不熟悉 TS,短期内维护成本大于收益。
7. 常见误区
- 误区 1:以为 TS 会在运行时保留所有类型信息。
- 大多数类型信息都会被擦除。
- 误区 2:以为用了 TS 就不会有线上类型问题。
- 外部数据、断言滥用、
any扩散都可能绕过保护。
- 外部数据、断言滥用、
- 误区 3:把 TS 价值只理解成“多写了点注解”。
- 它真正提升的是工程协作和可维护性。
速记要点
- JS 关注运行时,TS 在 JS 之上增加编译期类型系统。
- TS 最终还是编译成 JS 运行,不改变 JS 的运行时本质。
- TS 的核心价值在大型工程,不只是“语法更严格”。