TypeScript 的价值不只是语法提示,而是把一类错误从运行时挪到编译期。下面几个模式在日常代码里经常用到。
字面量联合类型
用字面量联合代替魔法字符串,拼写错误在编译期就会被发现:
type Status = 'pending' | 'processing' | 'done';
function updateStatus(status: Status) {
// ...
}
根据联合类型推导对象
需要给每个状态写配置时,可以用 satisfies 保证类型一致:
const statusLabels = {
pending: '待处理',
processing: '处理中',
done: '已完成',
} satisfies Record<Status, string>;
这样新增状态时,漏掉标签的配置会直接报错。
对象键的安全访问
当接口返回的字段可能缺失时,与其到处写 ?.,不如在入口处收敛成默认值:
function withDefaults(raw: Partial<User>): User {
return {
name: raw.name ?? 'anonymous',
role: raw.role ?? 'guest',
enabled: raw.enabled ?? false,
};
}
什么时候别过度设计
泛型工具不要为了用而用。类型设计的边界是:
- 业务字段变化频繁,需要类型约束;
- 多端共用同一份数据结构,需要单一来源;
- 调用方数量多,错误成本高。
只在一个文件里用一次的类型,直接写清楚就好。类型和注释一样,维护成本是真实的。