由 JS 转 TS 的必要性:不会 TS 的不是程序员
这不是一句暴论,而是一个工程判断。从百万行级大型项目到当今最火的 AI Agent 框架,TypeScript 已经是这个行业的默认语言——这篇文章用事实说话。
先说结论
不会 TypeScript 的程序员,在今天已经算不上合格的程序员。
这话刺耳,但不是我发明的观点,是市场用脚投票投出来的结果。判断一门技术是不是「必需」,别看培训机构的广告,看两样东西:大型项目选什么,最新的技术浪潮用什么。这两样,TS 都赢了。
一、大型项目给出的答案
1. VS Code:百万行级的全票
微软的 VS Code 是地球上代码量最大的开源项目之一——超过百万行,几乎 100% TypeScript。这不是试验品,是微软全家桶的生产力底座:VS Code 本身、Monaco Editor、Playground、乃至 Azure 的一大批工具链,全部 TS。
一个百万行项目的技术选型,考虑的不是「炫酷」,是十年尺度上的可维护性。JS 的动态类型在五千行时是自由,在五十万行时是债务。微软当年从 TypeScript 1.0 就开始押注,今天看是微软近十年最正确的技术决策之一。
2. 主流框架的全家桶倒戈
回头看前端框架的演进路线,几乎是一条「JS → TS」的单行道:
| 项目 | 现状 |
|---|---|
| Angular | 从 2.0 起就 TS-first,文档默认 TS |
| Vue 3 | 核心代码用 TS 重写,官方 Composition API 为 TS 优化 |
| Nest.js | 服务端框架,设计哲学就是「Angular 的 TS 纪律搬到 Node」 |
| Deno | 一出身就是 TS/JS 双原生运行时 |
| Prisma / tRPC | 「类型驱动」是卖点本身:改一处 schema,全链路类型自动同步 |
连以「轻量、零构建」著称的 Vue,都在 3.0 把内核换成了 TS。框架们用脚投票的方向,就是新手该学的方向。
3. 大厂的内部规范
Google 内部长期运行着以 TS 为主的前端技术栈;Meta 的 React 生态工具链(Babel、Metro、React 本身的新代码)全面 TS 化。一个语言被最大的几个代码库集体选中,说明的只有一件事:在规模化协作里,类型的收益超过了它的成本。
二、类型系统的三重价值
技术选秀讲完,讲点实在的。TS 对一个普通开发者的价值,至少有三层,层层加码。
1. 类型是不会过期的文档
JS 的函数签名是 function update(payload)——payload 里该有什么,只有调用方知道。TS 把契约写进签名:
interface UpdatePayload {
noteId: string;
content?: string;
tags?: string[];
}「这个函数怎么用」从此有了唯一权威答案,而且这个答案编译器会强制执行,不会像注释那样过期。
2. 把错误从运行时提前到编译期
JS 的错误路径是:写错 → 刷新 → 控制台 → 修复,最惨的情况是用户先发现。TS 的 strictNullChecks 把「这里可能为空」变成写代码那一刻就必须处理的命题:
// strictNullChecks 下:编译器强制你处理 user 不存在的情况
function greet(user: User | null): string {
return user ? `你好,${user.name}` : "访客";
}一次线上事故的成本是 N 个用户的信任,编译期拦截是把成本从生产环境搬回开发环境。
3. 重构从赌博变成流程
我在实验室维护的项目做过一次状态管理重构。如果那是 JS 项目,我不敢动——几十个文件、上百处调用,改完只能靠手动点一遍每个页面。TS 给的是另一套工作流:改接口定义 → 全项目红线列出所有受影响位置 → 逐个处理 → 编译通过即确信没漏网。
三、Agent 时代:TS 是 Agent 的母语
如果说「大项目用 TS」只证明了 TS 的现在,那 AI Agent 浪潮证明的是它的未来。看看当下最火的 Agent 技术栈是什么语言写的:
| 技术 | 语言 | 地位 |
|---|---|---|
| Vercel AI SDK | TypeScript | 前端接 LLM 的事实标准 |
| LangChain.js | TypeScript | LangChain 的官方 JS/TS 分支 |
| MCP(Model Context Protocol)官方 SDK | TS 为一等公民 | Agent 连接外部工具的标准协议 |
| Mastra / VoltAgent / CopilotKit | TypeScript | 新一代 Agent 框架几乎全部 TS-first |
为什么 Agent 生态和 TS 绑得这么死?三个原因,每一个都回到类型系统的本质。
1. 工具调用的入参出参,需要「机器可读的契约」
Agent 的核心动作是调用工具(function calling)。LLM 决定调用哪个工具、传什么参数——参数结构必须在 prompt 里被精确描述,并在代码里被精确校验。TS 的 interface 就是天然的参数 schema,人读得懂、LLM 读得懂、编译器还能帮你校验实现:
interface SearchNotesTool {
name: "search_notes";
parameters: {
keyword: string;
tags?: string[];
limit?: number; // 1-20
};
}2. 结构化输出 = 类型约束
让 LLM「随便输出点 JSON」是老问题,「输出符合业务结构的 JSON」是新刚需。Vercel AI SDK 的 generateObject 配 zod schema,本质上是用类型定义换确定性:模型被约束在结构里,解析代码因为有类型兜底,不需要写一堆防御性判断。
3. Agent 的载体就在 Web
大部分 Agent 产品的交互层是 Web。工具要对接前端与 Node 服务,TS 是这条链路上的通用语——Agent 越火,TS 的位置越稳。
我的判断
Agent 应用的可靠性 = 模型能力 × 工程约束。模型能力属于别人,工程约束属于你——而类型系统是性价比最高的约束手段。
四、回应几个反对声音
「JS 写了十几年,不也好好的?」 是,JS 很好,但「好好的」和「能 Scales」是两回事。个人脚本、几十行原型,JS 依然是最优解;但只要代码会被第二个人读、会被改第二次,就该上 TS。
「TS 编译慢、配置烦。」
Turbopack / esbuild 时代,类型检查已经可以和构建并行;一份 tsconfig.json 的痛苦是十分钟,收益是项目余生。
「Agent 用 Python 的更多。」 模型训练确实在 Python,但Agent 应用层——工具定义、编排、交互界面——正在被 TS 快速占领。而且本文的观点从来不是「TS 统治世界」,而是「你不会 TS,可选的位置会少一大半」。
小结
- 大型项目用脚投票:VS Code 百万行、Vue3 / Angular / Nest 全家桶 TS-first
- 类型三重价值:文档、防线、重构的胆量
- Agent 浪潮把 TS 推到更前:工具契约、结构化输出、Web 载体,全部是类型的主场
不会 TS 的不是程序员——这句话的真正含义不是「你是垃圾」,而是「这个行业已经把 TS 当成和英语一样的基础设施,而基础设施,没有讨价还价的余地」。
下一篇讲具体的:《如何快速由 JS 转 TS》——不重写、不停服,一步一步来。