Dark Dwarf Blog background

TypeScript Dispatch Map

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 出现一次。