← [ BACK_TO_NOTES ]

TypeScript 速记

TypeScript 高频概念、常见选择和工具类型的速记入口,用于复习和面试前快速回顾。

#dev #typescript #snippet #growing #interview

[!info] related notes

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:调用方不依赖返回值

高频判断方式

  • typeof
  • instanceof
  • in
  • 判空
  • 自定义类型谓词 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 的本质。

常见跳转

创建于 2025/1/1 更新于 2026/9/10
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本