ARTICLE · 1200845
看DeepSeekHarness源码学TypeScript编程03-TypeScript 的编译
看DeepSeekHarness源码学TypeScript编程03-TypeScript 的编译前面我们介绍有了AI编程之后,还是要具备一定的编程能力,不然,你会是Ai不称职的老板.上一节,我们一起学习了编程最基础的内容-类型声明和类型推断。 今天我们解决两件事:什么是编译,以及怎么在本地把 TS 环境搭起来——这是你后面每一节课都要用的基本功。 如果不知道编译是什么,那就是买了辆豪车却不知道发动机是什么。 编译的底层原理非常复杂,也非常难学。计算机专业的学生不见得有多少人真正掌握,但是现在大部分语言都有很好的编译工具,所以你只要知道编译是怎么回事,然后针对TS,Python等该怎么安装对应的编译器就行了。
上一节我们看过这段代码: 你现在能看懂了吧?——传入一个数值,加一再返回。但是计算机能看懂这段代码吗? 有同学可能会说:"这本来就是写给计算机看的,它当然认识。" 其实不是。计算机真正认识的,是下面这种代码,处理器能具体来说是右侧的机器码: 汇编: 机器码: 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只需要提供编译器就好,这个编译器本质上就是拆箱用的。
前置准备:装 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 模块,用下面的命令全局安装: 装完检查一下版本:
现在建一个专门的练习目录 fast-ts/,本课后面所有例子都放这里。打开终端,照着敲: 1. 建练习目录并进入 2. 生成本地 tsconfig.json(配置文件,后面章节会讲) 3. 建子目录 然后用你喜欢的编辑器打开 ch2/app.ts,写入: 编译: tsc 为什么不传文件名,直接tsc?当你的目录下有 tsconfig.json 时,直接 tsc 会让它自动找配置、自动找所有.ts文件。传了文件名反而会跳过 tsconfig用默认配置,不是我们想要的。 成功后,ch2/ 下会多出一个 app.js: fast-ts/ ├── tsconfig.json └── ch2/ ├── app.ts ← 你写的源码 └── app.js ← 编译出来的 JS 编译多个文件也可以: 没报错时 tsc 是静默的——没有任何输出就代表编译成功,不用找反馈。 那有报错时呢?看个例子: 但这里有个反直觉的点:编译报错了,.js文件照样生成!打开 app.js 你会看到: 为啥?TS 团队的意思是:"我只负责告诉你哪错了,改不改、怎么改,你自己定。"——有时候你可能想临时忽略一个类型错误先跑一下看看,所以产物还是会给你。 想让 TS 在报错时不生成产物?加 --noEmitOnError:
编译只是第一步,真正要让代码跑出结果,是用Node.js跑那个 .js 文件: 完整链路就这三步: app.ts ───▶ app.js ───▶ 程序输出 但你会发现——每次改完 TS 都要先 tsc 再 node,有点烦。社区做了直接跑 TS 的工具tsx,一步到位: 输出:123 它底层仍然是先编译再执行,只是帮你把两步合成了一步。本课后面的例子都会用npx tsx跑,你跟着敲就行。
下节就要操作 DSH 的大仓库了,先花两分钟认识每个 JS/TS 项目的"身份证"——package.json。新手只需要看懂四个字段: 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 源码整个拿下来,用源码把它跑起来:克隆、构建、启动、发出第一句话。纯操作手册式的一节,跟着文档照做就行。
我是纵横,全网第一个把 DSH 源码当教材的课程:从 DeepSeek Harness 源码学 TypeScript 编程。
什么是编译
function addOne(n: number){return n + 1;}
深入搞懂汇编/机器码怎么来的,是计算机组成原理一整门课,这里先跳过。
💡 一个重要结论:TypeScript 的类型检查只发生在编译阶段;代码一旦翻译成 JS 跑起来,运行时就不再检查类型了。所以类型错误必须在"写代码/编译"的时候就抓住,别指望跑起来再暴露。
安装 tsc 编译器
npm install -g typescript🤔 什么叫"全局安装"? 加 -g 参数后,这个工具会被装到系统全局,不管你 cd 到哪个目录,终端都能直接敲 tsc 命令——相当于把它扔进了"系统工具箱"。不加 -g,它就只装到当前项目的 node_modules/ 里。
tsc -vVersion 6.0.3
编译第一个 TS 文件
mkdir fast-ts && cd fast-tsnpx tsc --initmkdir ch2letfoo: string = "123";console.log(foo);📌 顺手记一个坑:如果你的 fast-ts/ 像我这样放在 DSH 仓库里面,没有先建本地 tsconfig.json 就直接 tsc,tsc 会向上找配置,撞到 DSH 根目录那个大 tsconfig.json,报 TS5112 错。这就是为什么要先 npx tsc --init——有了本地配置就能和 DSH 隔离开。
tsc file1.ts file2.ts// 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
var foo = 123;foo = 'abc';tsc --noEmitOnError把 TS 跑起来
node ch2/app.js输出:123
npx tsx ch2/app.ts看懂 package.json:scripts 与 dependencies
{"name":"my-app","scripts":{"dev":"vite","build":"tsc && vite build"},"dependencies":{"vue":"^3.5.0"},"devDependencies":{"typescript":"^6.0.0"}}















































































