从 unknown 到可辨识联合
联合类型描述“可能处于哪一种状态”,而不是把所有字段做成可选属性。可辨识联合用一个稳定的 kind 字段让控制流检查知道当前分支。
ts
type LoadState<T> =
| { kind: 'idle' }
| { kind: 'loading'; requestId: string }
| { kind: 'success'; data: T }
| { kind: 'error'; message: string };
function render(state: LoadState<string[]>) {
switch (state.kind) {
case 'idle': return '开始搜索';
case 'loading': return `请求 ${state.requestId}`;
case 'success': return state.data.join(', ');
case 'error': return state.message;
}
}与 { data?: T; error?: string } 相比,这种写法不会产生“同时有 data 和 error”或“什么都没有”的伪状态。新增分支时可以用穷尽检查让编译器提醒所有调用者。
练习
为搜索结果增加 empty 分支,并让渲染函数在未处理新分支时产生编译错误。不要使用 as 把状态强行转换成成功状态。