TypeScript 学习笔记
TypeScript 学习笔记
这是一份给自己看的笔记。每节课的内容都会追加到这里,方便回头复习。
进度:第 0 课(环境与第一个文件)— 进行中
学习路线
目标:开发微信小游戏。这个目标决定了要学什么、不用学什么。
目标确认
- 已有微信小游戏 AppID(发布阶段才用得上,现在不用配)
- 引擎选 Cocos Creator 3.x(TS 原生、导出小游戏一键、中文文档全)
- 游戏类型待定,建议等阶段二的手写 demo 做完再定 —— 那时候你会知道自己更想做哪种
前置知识
- HTML / CSS 不用学。 小游戏没有 DOM,没有网页标签,画面全靠 Canvas / WebGL 画出来,界面用游戏引擎的 UI 系统。
- JavaScript 必须学,但只学「游戏用得到的那部分」:变量、函数、对象、数组、条件、循环、事件回调。
- TypeScript 值得学:Cocos Creator 默认就用 TS,类型能帮你在写游戏逻辑时少踩一半坑。
四个阶段
| 阶段 | 内容 | 产出 |
|---|---|---|
| 一、语言(现在在这里) | JS 基础 + TS 类型,配对教学 | 能读懂、能改、能自己写小段逻辑 |
| 二、游戏基本功 | Canvas 2D 绘制、坐标系、游戏循环、触摸输入、碰撞检测、资源加载、状态机 | 手写一个能玩的小 demo(比如接住掉落物) |
| 三、引擎 | Cocos Creator 3.x:场景/节点/组件、预制体、动画、UI、音频、物理 | 用引擎做出完整小游戏 |
| 四、发布 | 微信开发者工具、AppID、分包、性能优化、审核规范、变现方式 | 真机预览 → 提审上线 |
阶段一的课时
| 课 | 先学 JS | 紧接着学 TS |
|---|---|---|
| 第 0 课 | 程序怎么跑起来 | 类型检查发生在编译期 |
| 第 1 课 | 变量、字符串、数字、布尔 | 类型标注、类型推断 |
| 第 2 课 | 函数、参数、返回值 | 函数签名、可选参数、void |
| 第 3 课 | 对象、数组 | interface / type、数组元素类型 |
| 第 4 课 | if、循环 |
类型收窄(typeof、in) |
| 第 5 课 | 多分支、状态 | 联合类型、字面量类型、可辨识联合 |
| 第 6 课 | 怎么复用代码 | 泛型入门 |
阶段一结束才进阶段二。基础没打牢就上引擎,等于开着飞机学走路。
第 0 课:环境与第一个文件
这一课不涉及语法,目标只有一个:让电脑能跑 TypeScript,并且亲眼看到「类型错误在编译前就被拦下来」。
本课拆成小步走,每做完一步等确认再继续: 0.1 装 Node → 0.2 跑第一个 JS 文件 → 0.3 装 TypeScript → 0.4 编译一次 → 0.5 看类型报错
先讲概念(小白必读,别跳过)
1. 程序是怎么跑起来的
你写的代码是纯文本,CPU 看不懂。中间必须有个「翻译」,把文本变成机器能执行的指令。这个翻译过程,笼统地叫编译或解释。
JavaScript 的做法是:浏览器或 Node 拿到源码,边读边执行。好处是改完刷新就生效,坏处是 —— 只有真正跑到那一行,才知道那里有没有错。
2. JavaScript 的「宽松」
JS 里变量的类型跟着值走,而且允许乱来:
let age = 18;
age = "十八"; // 不报错,值被换成了字符串
console.log(1 + "1"); // 输出 "11",不是 2
项目小的时候能忍,项目一大就是灾难:你以为是数字,实际是字符串,结果算错了,但程序不崩,错误悄悄往下传。
3. TypeScript 到底做了什么
TS 在 JS 的语法上加了一层「类型标注」,然后在你运行之前先做一遍静态检查:
let age: number = 18;
age = "十八"; // 这里直接标红,不许过
要记住三件事:
- TS 不改变 JS 的运行方式,它最后还是会变成 JS 去跑
- 类型检查发生在写代码 / 编译的时候,不是运行时
- 类型在编译后被全部擦掉,运行时一点痕迹都没有(所以它不占性能)
4. 四个必须分清的词
| 词 | 意思 | 什么时候出问题 |
|---|---|---|
| 编译期 | 把 .ts 翻译成 .js、同时检查类型的阶段 |
你保存文件、敲运行命令的那一刻 |
| 运行期 | .js 真正在 Node 里跑起来 |
程序真的执行到那一行 |
| 类型错误 | 类型对不上,比如 TS2322 |
编译期,程序还没跑 |
| 运行时错误 | 比如读了个不存在的文件、数组越界 | 运行期 |
一句话记住:类型错误永远发生在程序跑起来之前。如果程序跑起来了还崩,那是运行时错误,TS 管不了。
5. npm、package.json、node_modules 是什么
npm= Node 的「应用商店 + 管家」package.json= 购物清单(记录这个项目装了哪些包)node_modules= 仓库(真正下载下来的包都在这)npm i -D typescript= 从商店买typescript,记进清单,放进仓库(-D表示「只在开发时用」)
6. tsc、tsx、tsconfig.json 分别是什么
tsc= TypeScript 编译器(TypeScript Compiler),负责检查类型 + 生成.js,是这门语言的「正规军」tsx= 一个帮你「把.ts直接跑起来」的工具(内部先转译再交给 Node),学习期用它最省事tsconfig.json= 给编译器看的设置文件,相当于「编译器的遥控器」;strict: true就是把安全等级调到最高
7. 为什么 strict 一定要开
JS 有一堆历史包袱式的宽松行为:隐式 any、null 不检查、函数有的分支不返回值也不报错。strict 把这些全部升级成错误,逼你把每种情况想清楚 —— 这恰好是新手最该练的东西。现在被烦,总比写了几千行再回头补强。
1. 装 Node.js
TypeScript 的运行工具都挂在 Node 上,所以先装 Node。
打开 PowerShell(普通权限就行),执行:
winget install OpenJS.NodeJS.LTS
没有 winget 就去 nodejs.org 下 LTS 版本,一路默认安装。装完关掉 PowerShell 重新开一个,然后验证:
node -v
npm -v
正常会输出两个版本号,比如 v22.20.0 和 10.9.0。看到版本号才算过,报「无法识别」说明 PATH 没生效,重启电脑再试。
2. 建一个专门的学习目录
不要丢在桌面,单独建一个文件夹,以后所有练习都放这里:
mkdir D:\ts-study
cd D:\ts-study
npm init -y
npm i -D typescript tsx @types/node
三个包各自的作用:
typescript:编译器本体,提供tsc命令tsx:直接运行.ts文件的工具,省掉「先编译再运行」这一步@types/node:告诉 TypeScript「Node 有哪些内置功能」,不然用console都可能报类型错
3. 生成配置文件
npx tsc --init
会生成一个 tsconfig.json。打开它,把这一行的注释去掉(默认是注释状态):
"strict": true
strict 是 TypeScript 最有价值的一个开关:它把「可能为 null」「隐式 any」「函数返回值不一致」这些问题全部升级成错误。新手期一定要开,宁可现在被烦,也别等写了几千行再回头补。
4. 第一个文件
在 D:\ts-study 下新建 hello.ts:
const name: string = "宝库";
const age: number = 18;
function greet(who: string): string {
return `你好,${who}`;
}
console.log(greet(name));
console.log(`${name} 今年 ${age} 岁`);
运行:
npx tsx hello.ts
应该输出:
你好,宝库
宝库 今年 18 岁
5. 亲手制造一个错误
把 const age: number = 18; 改成:
const age: number = "18";
再运行一次。你会看到类似这样的报错:
hello.ts:2:7 - error TS2322: Type 'string' is not assignable to type 'number'.
这一行就是 TypeScript 的全部意义:错误在运行之前就被发现了。JavaScript 要到运行时才算、才崩,TypeScript 在写的时候就告诉你「这不对」。
改回去,这门课的第一个闭环就完成了。
本课作业
三道题,都是改代码,做完把代码和输出一起贴给我。
作业 1:在 hello.ts 里加一个变量 const isStudent: boolean = true;,用 console.log 打印出来。
作业 2:写一个函数 add(a: number, b: number): number,返回两数之和,调用它打印 3 + 5 = 8。
作业 3:故意写一个类型错误(比如把字符串赋给 number 变量),然后把完整报错贴给我,并用自己的话说明:报错里的 TS2322 和 Type 'string' is not assignable to type 'number' 分别在说什么。
本课验收(能答上来再往下走)
- 类型错误是在编译期还是运行期被发现的?
tsc和tsx分别干什么?为什么学习期用tsx?strict: true到底改变了什么?- 程序跑起来之后崩了(比如读文件失败),TypeScript 管得着吗?
答不上来就回头再看一遍第 3、4、6、7 小节 —— 这四个问题就是这一课的全部。
常见问题
npx卡住不动:npm 源的问题,执行npm config set registry https://registry.npmmirror.com再试tsx找不到:确认当前目录是D:\ts-study,而且package.json里有tsx这个依赖- 编辑器没提示:装 VS Code 后打开整个文件夹(不是单个文件),TypeScript 支持是内置的,不用装插件
第 1 课:类型基础
(下一课写)