夜雨聆风学习资料网

ARTICLE · 1200845

看DeepSeekHarness源码学TypeScript编程03-TypeScript 的编译

看DeepSeekHarness源码学TypeScript编程03-TypeScript 的编译

我是纵横,全网第一个把 DSH 源码当教材的课程:从 DeepSeek Harness 源码学 TypeScript 编程。

前面我们介绍有了AI编程之后,还是要具备一定的编程能力,不然,你会是Ai不称职的老板.上一节,我们一起学习了编程最基础的内容-类型声明和类型推断。
今天我们解决两件事:什么是编译,以及怎么在本地把 TS 环境搭起来——这是你后面每一节课都要用的基本功。
如果不知道编译是什么,那就是买了辆豪车却不知道发动机是什么。
编译的底层原理非常复杂,也非常难学。计算机专业的学生不见得有多少人真正掌握,但是现在大部分语言都有很好的编译工具,所以你只要知道编译是怎么回事,然后针对TS,Python等该怎么安装对应的编译器就行了。

什么是编译

上一节我们看过这段代码:
function addOne(n: number) {return n + 1;}
你现在能看懂了吧?——传入一个数值,加一再返回。但是计算机能看懂这段代码吗?
有同学可能会说:"这本来就是写给计算机看的,它当然认识。" 其实不是。计算机真正认识的,是下面这种代码,处理器能具体来说是右侧的机器码:
汇编:                                机器码:
pushq  %rbp                      55
movq   %rsp, %rbp             48 89 E5
leal   1(%rdi), %eax             8D 47 01
popq   %rbp                       5D
retq                                  C3
左边叫汇编语言,右边叫机器码。CPU 真正在执行的时候看到的就是右边这串十六进制数字——再往底层扒,就是 0 和 1 组成的二进制。
这些细节你不用记,只需要带走一个结论:代码写出来 CPU 认不出来,中间得有个工具把"人话"翻译成"机器话"。这个翻译过程就叫编译(compile)。

深入搞懂汇编/机器码怎么来的,是计算机组成原理一整门课,这里先跳过。

具体到 TypeScript:
TS 是在 JS 之上加了类型系统的"升级版",浏览器、Node.js 这些 JS 的运行环境,不认识 TS 代码,它们只认 JS。
所以 TS 要跑起来,必须先翻译成 JS——这一步就叫TS 的编译
TypeScript 官方没做运行环境(也没必要——跑的时候用 JS 的运行环境就行),只提供一个编译器,叫 tsc。它干的事也很简单:把类型声明相关的代码全部擦掉,剩下的 JS 原样输出,运行结果和你直接写 JS 完全一样。
举个例子,假如你将1W个货物发往国外,为了方便运输,肯定是要打包放到集装箱的,而到了目的地之后,你只要拆箱了,剩下的货物该怎么用还是怎么用。TS本质上就是为了程序员方便写代码而将JS封装起来的高级集装箱,执行的时候还是要先转换成JS,之后交给浏览器等该怎么执行就怎么执行了。
这也是为什么TS只需要提供编译器就好,这个编译器本质上就是拆箱用的。

💡 一个重要结论:TypeScript 的类型检查只发生在编译阶段;代码一旦翻译成 JS 跑起来,运行时就不再检查类型了。所以类型错误必须在"写代码/编译"的时候就抓住,别指望跑起来再暴露。


安装 tsc 编译器

前置准备:装 Node.js
想在本机玩 TS,你得先有Node.js(电脑里已经装了的同学跳过):
打开 nodejs.org,下载LTS 版本(22 或 24 都行)
一路下一步装完
打开终端,输下面两个命令,都能看到版本号就说明装好了:
node -v
比如 v22.11.0
npm -v
比如 10.9.0
Node.js 自带npm(Node Package Manager,Node 的包管理器),所以装了 Node.js 就自动有了 npm。
安装 tsc
tsc 是一个 npm 模块,用下面的命令全局安装:
npm install -g typescript

🤔 什么叫"全局安装"? 加 -g 参数后,这个工具会被装到系统全局,不管你 cd 到哪个目录,终端都能直接敲 tsc 命令——相当于把它扔进了"系统工具箱"。不加 -g,它就只装到当前项目的 node_modules/ 里。

装完检查一下版本:
tsc -v

Version 6.0.3

编译第一个 TS 文件

现在建一个专门的练习目录 fast-ts/,本课后面所有例子都放这里。打开终端,照着敲:
1. 建练习目录并进入
mkdir fast-ts && cd fast-ts
2. 生成本地 tsconfig.json(配置文件,后面章节会讲)
npx tsc --init
3. 建子目录
mkdir ch2
然后用你喜欢的编辑器打开 ch2/app.ts,写入:
letfoo: string = "123";console.log(foo);
编译:
tsc
为什么不传文件名,直接tsc?当你的目录下有 tsconfig.json 时,直接 tsc 会让它自动找配置、自动找所有.ts文件。传了文件名反而会跳过 tsconfig用默认配置,不是我们想要的。
成功后,ch2/ 下会多出一个 app.js:
fast-ts/
├── tsconfig.json
└── ch2/
├── app.ts   ← 你写的源码
└── app.js   ← 编译出来的 JS

📌 顺手记一个坑:如果你的 fast-ts/ 像我这样放在 DSH 仓库里面,没有先建本地 tsconfig.json 就直接 tsc,tsc 会向上找配置,撞到 DSH 根目录那个大 tsconfig.json,报 TS5112 错。这就是为什么要先 npx tsc --init——有了本地配置就能和 DSH 隔离开。

编译多个文件也可以:
tsc file1.ts file2.ts
没报错时 tsc 是静默的——没有任何输出就代表编译成功,不用找反馈。
那有报错时呢?看个例子:
// app.tsletfoo: number = 123;foo = 'abc';  // 类型不对跑 tsc 会看到:app.ts:2:1 - error TS2322: Type 'string' is not assignable // to type'number'.2 foo = 'abc';     ~~~Found 1 error in app.ts:2
但这里有个反直觉的点:编译报错了,.js文件照样生成!打开 app.js 你会看到:
var foo = 123;foo = 'abc';
为啥?TS 团队的意思是:"我只负责告诉你哪错了,改不改、怎么改,你自己定。"——有时候你可能想临时忽略一个类型错误先跑一下看看,所以产物还是会给你。
想让 TS 在报错时不生成产物?加 --noEmitOnError:
tsc --noEmitOnError

把 TS 跑起来

编译只是第一步,真正要让代码跑出结果,是用Node.js跑那个 .js 文件:
node ch2/app.js输出:123
完整链路就这三步:
app.ts  ───▶  app.js  ───▶  程序输出
但你会发现——每次改完 TS 都要先 tsc 再 node,有点烦。社区做了直接跑 TS 的工具tsx,一步到位:
npx tsx ch2/app.ts
输出:123
它底层仍然是先编译再执行,只是帮你把两步合成了一步。本课后面的例子都会用npx tsx跑,你跟着敲就行。

看懂 package.json:scripts 与 dependencies

下节就要操作 DSH 的大仓库了,先花两分钟认识每个 JS/TS 项目的"身份证"——package.json。新手只需要看懂四个字段:
{"name":"my-app","scripts":{"dev":"vite","build":"tsc && vite build"},"dependencies":{   "vue":"^3.5.0"},"devDependencies":{  "typescript":"^6.0.0" }}
scripts:命令的快捷方式。
"dev": "vite" 意味着你敲 npm run dev 就等于敲 vite。下节的 pnpm dsh web、pnpm run build 全是这么来的——看到陌生命令,先去package.json的scripts里查它真实执行了什么;
dependenciesvsdevDependencies:前者是
运行时真的需要的包(如 vue),后者是开发期才用的工具(如 typescript——编译完就不参与了)。装包时 npm i xxx 进前者,npm i -D xxx 进后者;
旁边的node_modules/是所有依赖实际存放的目录(巨大,别提交 git),package-lock.json/pnpm-lock.yaml锁定每个依赖的精确版本,保证你和我装出来的一模一样。
读源码第一动作也是它:打开陌生仓库先看 package.json 的 name、scripts、dependencies——这个项目是什么、怎么跑、靠谁活着,一分钟看清。

本节小结

编译 = 把 TS 翻译成 JS 才能跑
工具叫 tsc,装了 Node.js 后 npm install -g typescript 就能用。
tsconfig.json
= 项目级的编译配置;练习目录下 npx tsc --init 一键生成,还能避开 DSH 大仓库的 tsconfig 冲突。
跑 TS 代码
老派做法 tsc 编译 + node xxx.js 执行;新派做法 npx tsx xxx.ts 一步到位,本课统一用后者。
作业:
在 fast-ts/ch2/ 下建一个新文件 hello.ts,内容是 console.log('Hello, DSH!');
用两种方式跑起来:① tsc 编译 + node ch2/hello.js 执行;② npx tsx ch2/hello.ts 一步到位
对比两种方式的输出,想想各自适合什么场景(提示:生产部署 vs 本地调试)
下集预告:环境搭好了,是时候干件大事——下节把 150k star 的 DSH 源码整个拿下来,用源码把它跑起来:克隆、构建、启动、发出第一句话。纯操作手册式的一节,跟着文档照做就行。

相关学习资料