跳到主要内容

说说 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 的核心价值在大型工程,不只是“语法更严格”。