TypeScript Dispatch Map
在写 React Query 的时候遇到了一个神奇的结构,这里记录一下。
1. 核心思想
Discriminated Dispatch Map / Type-safe Lookup Table 是一种利用联合类型+映射类型的数据类型,它在编译期强制保证:每一种 discriminator 都必须有一个处理逻辑,而且永远不会取到 undefined。可以理解其为被TypeScript类型检查过的类型表。
首先看下面的 switch 例子:
type ViewType = "starred" | "trash" | "recent";
function handle(type: ViewType) {
switch (type) {
case 'starred': ...
case 'trash': ...
}
}
在handle的 switch 语句中,即使我们遗漏了一个 ViewType,TypeScript也不会报错。这时,我们可以把 if/switch 逻辑,变成一个对象:
const handlers = {
starred: () => ...
trash: () => ...
recent: () => ...
};
然后这样调用它:
handlers[type]();
我们通过把逻辑塞进结构而不是控制流中实现了类型检查。
2. 实现
Dispatch Map的核心实现如下:
Record<Union, Value>;
这里,Union 中的每一个成员,都必须作为 key 出现一次。