← 所有文章

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 使用。

用联合类型描述状态#

请求状态经常被写成多个布尔值,例如 loadingerrorsuccess。它们可能组合出不合理的情况。联合类型可以直接限定允许出现的状态。

type RequestState<T> =
| { status: 'idle' }
| { status: 'loading' }
| { status: 'success'; data: T }
| { status: 'error'; message: string };

statussuccess 时,TypeScript 会自动知道 data 存在。这样的类型既是约束,也是业务说明书。

少用类型断言#

as 会告诉编译器“相信我”,但不会改变运行时数据。频繁断言往往意味着类型设计或数据校验存在缺口。优先使用条件判断、类型守卫和明确的返回类型,让编译器根据事实完成收窄。

类型越贴近真实业务状态,开发时需要记忆的隐含规则就越少。