TypeScript

TypeScript 主题总览,说明语言本体、类型系统、编译器、配置系统与语言服务之间的基本结构。

#tech / dev #resource / typescript #type / concept #status / growing

TypeScript

[!info] related notes

一句话定义

TypeScript 是 JavaScript 的静态类型系统与工具链集合,它在不改变 JavaScript 运行时本质的前提下,为大型代码库提供类型检查、编辑器智能能力和更稳定的工程边界。

核心结构

理解 TypeScript,至少要分清 4 个层次:

  1. 语言与类型系统
  2. 编译器 tsc
  3. 配置系统 tsconfig.json
  4. 语言服务与 tsserver

语言与类型系统

这是 TypeScript 最直接的一层,负责表达:

  • 基础类型与对象类型
  • 联合、交叉、泛型
  • 条件类型、映射类型、工具类型
  • 类型推断与类型收窄

这一层回答的是:

代码在编译阶段应该被理解成什么类型。

tsc

tsc 是 TypeScript 编译器。它负责:

  • 读取源码和 tsconfig
  • 做类型检查
  • 生成 JavaScript、.d.ts、sourcemap
  • 在 build mode 中处理 project references

这一层回答的是:

这些 TypeScript 文件如何被编译和验证。

tsconfig.json

tsconfig 用来定义一个 TypeScript program 的边界和编译规则,例如:

  • include / exclude
  • strict
  • module / target
  • paths / baseUrl
  • declaration / composite / references

这一层回答的是:

TypeScript 应该以什么规则理解和构建这个项目。

语言服务与 tsserver

编辑器里的这些体验通常来自 TypeScript 语言服务:

  • hover
  • 跳转定义
  • 自动补全
  • quick fix
  • 语义诊断

tsserver 则是把这些能力提供给 VSCode 等编辑器的后台服务。

这一层回答的是:

编辑器为什么知道这里是什么类型,为什么这里会出现红线。

为什么要按结构理解

很多 TypeScript 问题,本质上不是“语法不会”,而是混淆了不同层次:

  • 以为类型系统能解决运行时校验
  • 以为 paths 配了就等于运行时 alias 也配好了
  • 以为编辑器报错和命令行报错一定来自同一套上下文
  • 以为 tsc、bundler、ESLint 都在做同一件事

一旦把语言、编译器、配置和语言服务分开看,很多问题会明显简单很多。

常见学习路径

推荐按这个顺序进入:

  1. 先掌握基础类型、联合类型、泛型、类型收窄
  2. 再理解 tsctsconfig 和严格模式
  3. 再进入声明文件、全局扩展、import type 等边界话题
  4. 最后再看 monorepo、project references、编辑器诊断差异

边界与易混淆点

TypeScript 不是运行时验证器

TypeScript 主要工作在编译阶段。它可以表达“应该是什么类型”,但不能替代:

  • 运行时数据校验
  • API 输入校验
  • 用户输入可信度判断

TypeScript 不是打包器

tsc 能编译,但不等于现代前端项目的完整构建链。代码拆分、资源处理、HMR、产物优化通常仍要靠 bundler 或框架工具链。

TypeScript 也不是 ESLint

TypeScript 负责类型语义;ESLint 负责代码风格、部分风险模式和规则治理。两者经常一起出现,但职责不同。

参考信息

创建于 2025/1/1 更新于 2026/5/27