TypeScript 知识图谱
- 主题域:typescript
- 关键词:TypeScript、TS、类型系统、泛型、工具类型、tsconfig、知识图谱、学习路线
- 状态:草稿
一、一句话结论
TypeScript 体系分六层看:类型基础 → 类型收窄 → 泛型 → 工具类型 → 声明与互操作 → 工程配置;它的本质是一句话——编译期类型层,运行时全部擦除,所以类型写得好是文档与重构安全网,运行时校验仍要靠校验库(如 zod)。
二、原理与来由(分层依据)
TS = JS + 静态类型层。分层按「一个值的类型知识如何产生与流动」:先有基础类型标注 → 通过控制流分析收窄到更精确的类型 → 泛型让类型随参数流动 → 工具类型在类型层做「运算」→ 声明文件描述外界的 JS 世界 → tsconfig 决定编译器多严格、产物长什么样。全部层都只在编译期存在。排查 TS 问题先分清:是类型报错(编译期)还是运行时行为(JS 层),两者的修法不同。
三、细节与用法
① 类型基础
| 主题 |
一句话要点 |
检索关键词 |
| 基础与特殊类型 |
原始类型小写(string 不是 String);any 放弃检查、unknown 安全未知(用前必须收窄)、never 不可达、void 无返回 |
any、unknown、never |
| 数组与元组 |
T[] / Array<T>;元组 [a: string, b?: number] 固定长度与位置类型,带标签可自文档化 |
元组、具名元组 |
| 枚举 |
enum 生成运行时对象(有代价);字符串字面量联合类型 + as const 常是更轻的替代 |
enum、as const |
| 函数类型 |
参数与返回类型;可选 / 默认参数;函数重载是签名列表 + 一个实现签名 |
重载、签名 |
| interface vs type |
interface 可声明合并、可 extends;type 能做联合、交叉、条件类型;对象形状两者皆可,按团队约定统一 |
interface、type 区别 |
② 类型收窄(narrowing)
| 主题 |
一句话要点 |
检索关键词 |
| 控制流分析 |
if/typeof/instanceof/真值检查都会收窄类型;分析沿控制流传播(先判空后用) |
收窄、控制流 |
| 可辨识联合 |
`{ kind: "circle" } |
{ kind: "square" }+ switch(kind) 是 TS 建模多态数据的标准姿势;穷尽检查用never` 兜底 |
| 类型守卫 |
自定义守卫 x is Foo;断言 as(骗编译器,慎用)、非空断言 !;satisfies 校验不改变推断 |
类型守卫、satisfies、as |
③ 泛型
| 主题 |
一句话要点 |
检索关键词 |
| 类型参数 |
<T> 让类型随调用流动;泛型约束 T extends Xxx 限定能力范围 |
泛型、约束 |
| keyof 与索引访问 |
keyof T 取键联合;T[K] 取值类型;两者组合是类型安全取值的钥匙 |
keyof、索引访问 |
| 条件类型 |
A extends B ? X : Y 类型层的三元;infer 在匹配中提取类型(如 ReturnType<T> 的实现) |
条件类型、infer |
| 映射与内置工具 |
Partial/Required/Pick/Omit/Record/Readonly/Exclude/Extract/ReturnType/Parameters——映射类型 + keyof 的组合产物 |
工具类型、映射类型 |
| 模板字面量类型 |
`on${Capitalize<K>}` 在类型层拼接字符串,事件名等字符串模式类型化 |
模板字面量类型 |
④ 声明与互操作
| 主题 |
一句话要点 |
检索关键词 |
| 声明文件 |
.d.ts 只描述类型;三方库类型在 DefinitelyTyped(@types/xxx)或包内自带 |
d.ts、@types |
| 渐进迁移 |
allowJs 允许 JS/TS 混居;checkJs 选择性检查 JS;// @ts-ignore / @ts-expect-error 局部压制(后者断言下一行真的有错) |
渐进迁移、ts-expect-error |
| 运行时边界 |
接口 / 类型标注在运行时不存在——外部输入(网络、用户)的类型校验不能靠 TS,用 zod / valibot 等运行时校验库 |
运行时校验、zod |
⑤ 工程配置(tsconfig)
| 主题 |
一句话要点 |
检索关键词 |
| strict 全家桶 |
strict: true 是新项目底线(strictNullChecks 最值);noUncheckedIndexedAccess 更严(索引访问带 undefined) |
strict、strictNullChecks |
| 模块解析 |
moduleResolution: bundler(现代打包器)/ node(CJS);paths 别名与构建工具的 alias 要同步配 |
模块解析、paths |
| 编译产物 |
tsc 只擦类型(isolatedModules 下不做类型级转换);实际打包交给 esbuild / Vite / swc,tsc 专职类型检查(noEmit) |
noEmit、tsc vs esbuild |
| 项目引用 |
大仓拆分:references + composite 分包增量检查 |
项目引用、增量构建 |
⑥ 生态与演进
| 主题 |
一句话要点 |
检索关键词 |
| 装饰器 |
旧 experimental decorators(框架在用)与新标准 decorators 装饰器语义不同,迁移看框架版本 |
装饰器、标准装饰器 |
| 类型挑战 |
type-challenges 仓库是泛型 / 条件类型的系统训练场 |
type-challenges |
| 版本演进 |
5.x 主线(satisfies、const 类型参数、装饰器稳定化);官方 Go 移植编译器(tsgo / Corsa 项目)大幅提速——落地状态待核实 |
TS 5、tsgo |
四、流程图(图谱一页图)
flowchart TD
subgraph S1["① 类型基础"]
A1["原始 · 特殊类型"]
A2["元组 · 枚举"]
A3["interface vs type"]
end
subgraph S2["② 类型收窄"]
B1["控制流分析"]
B2["可辨识联合"]
B3["类型守卫 · satisfies"]
end
subgraph S3["③ 泛型"]
C1["约束 · keyof"]
C2["条件类型 · infer"]
C3["映射类型"]
end
subgraph S4["④ 工具类型"]
D1["Partial · Pick · Record"]
D2["模板字面量类型"]
end
subgraph S5["⑤ 声明与互操作"]
E1["d.ts · @types"]
E2["渐进迁移"]
E3["运行时校验边界"]
end
subgraph S6["⑥ 工程配置"]
F1["strict 全家桶"]
F2["模块解析 · noEmit"]
F3["项目引用"]
end
S1 -->|"标注后收窄"| S2
S2 ~~~ S3
S3 ~~~ S4
S4 ~~~ S5
S5 ~~~ S6
层间竖排是阅读顺序;所有层都只存在于编译期,运行时全部擦除。
五、边界与关联
- 本条目是 TS 体系地图:只给主题与一句话定位,展开进细分条目(建立后在
content/README.md 登记)。
- 不覆盖:JS 语言本体(见 JavaScript 知识图谱)、具体框架的类型用法(React/Vue 的类型技巧)。
- 关联条目:JavaScript 知识图谱(TS 是它之上的类型层,运行时行为全部继承)。
六、出处
| 来源 |
位置 |
核实日期 |
| TypeScript 官方手册(Handbook + Release Notes) |
typescriptlang.org/docs |
2026-10-08 |
| TypeScript Wiki(编译选项与迁移指南) |
github.com/microsoft/TypeScript/wiki |
2026-10-08 |
| 个人实践(TS 全栈开发经验) |
各层一句话要点为经验浓缩 |
2026-10-08 |
七、存疑与待办
- 官方 Go 移植编译器(tsgo)当前版本与覆盖度未核实——待核对官方博客(2026-10-08 记)。
- TS 当前最新小版本号未核实——待核对 release notes(2026-10-08 记)。