什么是 TypeScript?

TypeScript 的主要特点、现实世界中的用法与示例、与其他语言的差异,以及对静态/动态类型、面向对象支持、高级语言与否、编译为 JavaScript 并由引擎执行等问题的说明。

TypeScript 就像软件开发中的一道护栏:它不会替你写完整个应用,也不会替团队做产品取舍;而是在写代码的过程中尽早标出明显错误,降低小问题滚成大故障的可能。

什么是 TypeScript?

TypeScript 是微软推出、建立在 JavaScript 之上的语言。普通 JavaScript 可以放在同一个 TypeScript 项目里, 再叠加静态类型、接口与类型检查。TypeScript 编译器会把源代码编译成常规的 JavaScript,供浏览器或 Node.js 等环境运行。

欧拉图风格示意:较小的 JavaScript 圆完全落在较大的 TypeScript 圆内。
JavaScript 是 TypeScript 的子集。

在编辑阶段,可靠的编辑器会与 TypeScript 配合,提示错误类型、错误的函数调用和缺失字段。问题往往在运行前就暴露, 应用越大、协作越多,这一点越重要。

在类型与工具的帮助下,代码结构更清晰、更易维护。下文概述其特性、使用情况、与其他语言的差异,以及在类型模型、面向对象、 抽象层级、编译与执行方式上的简明归类。

TypeScript 的突出特点

TypeScript 以可预期的结构与可扩展的工具链著称。

  • 可选静态类型: 在有意义的地方加注类型;在编辑与构建阶段检查,减少运行时才察觉的静默错误。
  • 类型推断: 检查器能根据数值与控制流推断大量类型,减轻逐行手写注解的负担。
  • 接口与类型别名: 数据形状与契约更明确,团队对 API 与领域模型更易达成一致。
  • 类与泛型: 面向对象写法与可复用抽象,是库与框架中的一等能力。
  • 与 JavaScript 互操作: 既有库可通过声明文件或宽松的类型适配接入,便于渐进采纳。
  • 编辑器集成: 自动补全、安全重构和内联提示,都依赖对类型的准确把握。

下面的片段把带类型的数据与普通 JavaScript 风格的逻辑放在一起;检查器知道 Book 的形状以及 formatTitle 的返回类型:

type Book = {
  title: string;
  year: number;
};

function formatTitle(book: Book): string {
  return `${book.title} (${book.year})`;
}

console.log(formatTitle({ title: "Zero to One", year: 1962 }));

若传给 formatTitle 的对象缺少 year,或在应为数字的位置传入字符串,TypeScript 会在运行之前给出提示。

总体而言,这些特点有助于减少缺陷、加快重构,并让大型代码库保持清晰一致。

TypeScript 在现实中的应用

只要 JavaScript 能跑的地方,尤其是对协作演进要求高的团队,就很容易看到 TypeScript。

大型网站和**单页应用(SPA)**常与 React、Angular、Vue 以及 Next.js、Remix 等栈一起使用。后端团队也会在 NestJS、 带类型的 Express 路由等场景使用它;Electron、类 VS Code 的扩展同样需要可安全演进的大型代码。

一些实例:

  • SaaS 的内部控制台与客户门户(例如 Shopify 的工程内容长期展示较重的 TypeScript 实践)。
  • 微软开发与推广 TypeScript 本身,并在产品与工具链中大量使用。
  • Airbnb、Slack 等企业曾为「大规模在前端采用 TypeScript」提供公开案例(叙述会更新,但整体生态向「强类型前端」倾斜是清楚的)。

简单说:当 JavaScript 仓库的复杂度、协作成本与长期维护压力超过引入类型的前期投入时,团队往往会采纳 TypeScript。

与其他语言的差异

并列比对通常比长段文字更直观。下表概括常见维度(写的是典型路径,不是所有边缘情形):

维度TypeScriptJavaScriptPythonJava
运行前的静态检查有,经编译器与编辑器对整个语言而言没有统一的静态阶段;类型主要体现在运行时可选,常用独立类型检查工具编译期强制检查
浏览器 SPA 的常见路径先转译为 JavaScript 再交付直接编写与部署 JavaScript往往不是典型前端生产路径往往不是典型前端生产路径
编写时的类型风格结构类型为主,也支持类动态对象动态值;可写可选类型标注多为名义类型(类/接口体系)
交付后的典型运行时经转译后在浏览器或 Node 中运行浏览器或 Node 引擎CPython 等虚拟机JVM 字节码

TypeScript 扎根于 JavaScript 平台:最终交付仍是 JavaScript,只是在发布前多一道检查与更丰富的类型语法。Java、Python 在各自的虚拟机与工具链上各有所长; TypeScript 的鲜明含义是 面向 NPM 与浏览器生态的「带类型的编写方式」,而不是在所有领域替代上述平台。

简明问答

静态类型还是动态类型?

在实践中偏静态。 TypeScript 在生成的 JavaScript 实际运行之前做类型检查。部署后的运行时行为仍是动态的 JavaScript,但日常使用 TypeScript 通常意味着接受这些事前信号。 仍可使用 any 等退路,有经验的团队会有意收紧它们,因为可预期的约束才是核心价值。

是否支持面向对象?

支持。 extends 继承、private / public 等修饰符、接口与泛型都带有鲜明的 OO 色彩;同时也会与结构类型等习惯混用,整体仍便于面向对象的组织。

是否是高级语言?

是。 不必直接摆弄 CPU 寄存器或手工管理底层内存;概念更贴近界面、REST API、业务流程而非机器指令。

算编译还是解释?

两边都要说清楚: 源代码用 TypeScript 书写,tsc 编译器(或调用它的打包工具)先把它们转译成清晰的 JavaScript;之后由浏览器或 Node 中成熟的引擎执行(现代引擎常以 JIT 方式编译热点代码)。业内常说的概括是:「TypeScript 先编译成 JavaScript,再由 JavaScript 引擎执行。」

收尾

当今 Web 在很大程度上建立在 JavaScript 之上,几乎所有主流浏览器都内置 JavaScript 引擎。

这一情况不变:最终上线的仍然是普通 JavaScript。TypeScript 主要补充的是带类型的源码与构建期检查,从而更早发现问题、 让大型项目在长期演进中更易修改——运行机制仍是同一批 JavaScript 引擎。