我有以下简化示例:
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
对象的键?>
答案 0 :(得分:3)
我认为您正在寻找索引类型。
type RequestHandler = Record<RequestStatus['type'], () => void>
注意RequestStatus['type']
。关于索引类型的好处是,如果添加或更改类型,则无论使用索引签名的位置如何,该类型都会自动应用。