TypeScript 速记
TypeScript 高频概念、常见选择和工具类型的速记入口,用于复习和面试前快速回顾。
[!info] related notes
- 所属 MOC: TypeScript MOC
- 总览页: TypeScript
- 运行时可信边界: TypeScript 静态类型与运行时校验
- 状态建模: TypeScript 可辨识联合与穷尽检查
- 结构兼容: TypeScript 结构化类型与函数兼容性
- 相关概念: TypeScript 中的 unknown 与 any, TypeScript 中的 import type 与普通 import
- 面试页: TS 常用工具类型有哪些,怎么用, TS 里 type 和 interface 的区别
TypeScript 速记
60 秒心智模型
TypeScript 的核心价值不是“给 JavaScript 多写几个类型”,而是把一部分程序约束提前到编译期。它主要采用结构化类型:值只要满足所需形状就能兼容;但类型在运行时会被擦除,所以网络、JSON、localStorage 等外部数据不能因为写了
as T或Promise<T>就可信。边界数据应先作为unknown,经过 narrowing、type guard 或 Schema/parser 获得运行时证据,再进入可信业务类型。对于有限业务状态,可以用 discriminated union 把合法组合编码进类型,并用never做 exhaustive check,让新增状态后的遗漏分支直接变成编译错误。
快速记忆:
结构化类型:看形状,不看名字
类型擦除:编译后类型不存在
unknown:先证明,再使用
as T:告诉编译器,不是验证数据
Schema/parser:运行时建立可信边界
Discriminated union:把合法状态写进类型
never:证明分支已经穷尽
高频类型
- string
- number
- boolean
- null
- undefined
- symbol
- bigint
高频组合
- array 数组
- tuple 元组
- object
- union
| - intersection
& - generic
<T>
高频特殊类型
any:基本放弃这段值的类型保护unknown:值不确定,必须先收窄再操作never:正常情况下不可能出现的值;常用于穷尽检查void:调用方不依赖返回值
高频判断方式
typeofinstanceofin- 判空
- 自定义类型谓词
arg is Type - assertion function
asserts arg is Type
契约与运行时可信边界
Structural typing
“你至少具有我要使用的这些成员吗?”
已有变量多出来的字段通常不影响结构兼容;fresh object literal 还会触发 Excess Property Checking,主要帮助发现拼写和多余字段错误。
Type erasure
interface、type annotation、泛型和大多数类型断言不会作为运行时验证逻辑保留在最终 JavaScript 中。
unknown vs any
any:绕过检查,风险向后传播unknown:把不确定性留在边界,要求拿到证据再使用
as T
const user = responseJson as User;
只改变 TypeScript 如何看待 responseJson,不会验证 id、name 等字段真的存在。
Runtime Schema
unknown
↓
Schema / parser / type guard
↓
validated output
↓
trusted business type
网络响应、消息协议、持久化数据等边界尤其应该这样处理。
Discriminated union
适合有限状态:
type Result<T> =
| { status: 'loading' }
| { status: 'success'; data: T }
| { status: 'error'; error: Error };
它让状态和该状态合法的数据绑定,减少“多个 optional 字段组成非法状态”的问题。
Exhaustive narrowing
assertNever(value) 能在新增 union variant 后暴露遗漏分支。noImplicitReturns 只检查返回路径是否完整,不等价于真正的联合穷尽检查。
高频工具类型
Partial<T>Required<T>Pick<T, K>Omit<T, K>Record<K, V>ReturnType<T>Parameters<T>Awaited<T>
高频选择题
unknown vs any
any:放弃类型检查unknown:先缩小再使用
type vs interface
interface更适合描述对象形状和扩展关系type更适合组合、联合、映射和别名- 两者并不是“谁更高级”,应按建模语义和团队约定选择
import type vs 普通 import
- 只做类型引用时优先
import type - 需要运行时值时用普通
import
面试表达模板
“TypeScript 能保证 API 返回值安全吗?”
不能。TypeScript 类型只在编译期存在,HTTP payload 是运行时数据。给
response.json()写泛型或做as T只是静态承诺;真正的 trust boundary 应把输入当unknown,经过 Schema 或 parser 校验后再得到可信类型。
“为什么用 discriminated union?”
我通常用它建模有限业务状态。共同的 literal discriminant 既能帮助控制流收窄,也能把每种状态合法的数据绑定起来;再配合
never做穷尽检查,可以让新增状态后的遗漏处理在编译期暴露。
“TypeScript 为什么说是结构化类型?”
因为兼容性主要看值的成员形状是否满足目标类型,而不是看它声明时叫什么名字。fresh object literal 的 Excess Property Checking 是额外的防误用机制,并不改变 structural typing 的本质。
常见跳转
- 编译器:tsc
- 配置:tsconfig 使用详解
- 类型检查:TypeScript 类型检查
- 工具类型面试:TS 常用工具类型有哪些,怎么用
- 高级类型:TypeScript 高级类型