将接口的键设置为其他接口的可能值?

时间:2019-06-05 03:51:11

标签: typescript

我有以下简化示例:

interface SuccessStatus {
  type: 'success';
  payload: string;
}

interface LoadingStatus {
  type: 'loading';
} 

interface ErrorStatus {
  type: 'error';
  error: string;
}

type RequestStatus = SuccessStatus | LoadingStatus | ErrorStatus;

“请求状态”类型的对象的type属性为'success' | 'loading' | 'error'

牢记RequestStatus,我想要一个对象,其中每个键都是RequestStatus.type的可能值之一。让我们将此新对象类型称为Handler

Handler类型的对象看起来像这样:

const requestHandler = {
  success: () => null, //some function to handle a success state
  loading: () => null,
  error: () => null,
}

我在弄清楚如何定义Handler的类型时遇到了麻烦。我知道密钥将被动态评估[x: keyof something],但是我不知道如何准确地定义密钥而不修改RequestStatus的定义,我可以这样做,但是我想弄清楚是否存在是使用当前定义执行此操作的一种方法。

为了娱乐,还有一种方法可以向Handler添加泛型,以便根据我们作为Handler<T>传递的内容来确定T对象的键?

1 个答案:

答案 0 :(得分:3)

我认为您正在寻找索引类型。

type RequestHandler = Record<RequestStatus['type'], () => void>

注意RequestStatus['type']。关于索引类型的好处是,如果添加或更改类型,则无论使用索引签名的位置如何,该类型都会自动应用。

Here's an example