TypeScript 实战:让类型真正帮助开发
从数据边界、联合类型到类型收窄,用更少的断言换来更可靠的前端代码。
TypeScript #TypeScript#类型安全#最佳实践
TypeScript 的价值不是让每个变量都写上类型,而是在代码可能出错的地方提前给出提醒。真正有效的类型通常出现在接口数据、组件属性和业务状态这些边界上。
不要盲目信任接口数据#
接口返回值来自运行时,即使写了类型声明,也不能保证真实数据一定符合约定。重要数据应在进入业务代码前完成校验和转换。
type User = { id: string; name: string;};
function isUser(value: unknown): value is User { if (!value || typeof value !== 'object') return false; const user = value as Record<string, unknown>; return typeof user.id === 'string' && typeof user.name === 'string';}这里使用 unknown,意思是“暂时不知道它是什么”。只有检查通过后,数据才会被当作 User 使用。
用联合类型描述状态#
请求状态经常被写成多个布尔值,例如 loading、error 和 success。它们可能组合出不合理的情况。联合类型可以直接限定允许出现的状态。
type RequestState<T> = | { status: 'idle' } | { status: 'loading' } | { status: 'success'; data: T } | { status: 'error'; message: string };当 status 为 success 时,TypeScript 会自动知道 data 存在。这样的类型既是约束,也是业务说明书。
少用类型断言#
as 会告诉编译器“相信我”,但不会改变运行时数据。频繁断言往往意味着类型设计或数据校验存在缺口。优先使用条件判断、类型守卫和明确的返回类型,让编译器根据事实完成收窄。
类型越贴近真实业务状态,开发时需要记忆的隐含规则就越少。