我想在Message
和Response
子类型之间创建一些抽象关系,这样我就可以有一个通用函数,它将Message
作为参数,并返回Response
。然而,每当函数被MessageTypeA
类型调用时,我希望响应类型为ResponseTypeA
,并希望TypeScript以某种方式确保这种关系。考虑以下TypeScript代码来说明问题:
type MessageTypeA = { a: string };
type MessageTypeB = { b: number };
type MessageTypeC = [number, number];
type Message = MessageTypeA | MessageTypeB | MessageTypeC;
type ResponseTypeA = { a: boolean; aa: number };
type ResponseTypeB = "hello" | "bye";
type ResponseTypeC = number;
type Reponse = ResponseTypeA | ResponseTypeB | ResponseTypeC;
type Pair<M extends Message, R extends Reponse> = {
message: M;
response: R;
};
// I know this should be some type of Map/Record instead
type ValidPairsMap =
| Pair<MessageTypeA, ResponseTypeA>
| Pair<MessageTypeB, ResponseTypeB>
| Pair<MessageTypeC, ResponseTypeC>;
// Something like this, I know syntax is wrong here:
function sendMessageReturnResponse<T extends ValidPair>(
message: typeof T.message
): typeof T.response {
throw "idk how to do this";
}
function main() {
let mesA: MessageTypeA = { a: "msg" };
let resA: ResponseTypeA = sendMessageReturnResponse(mesA);
// error: return value of sendMessageReturnResponse cannot be inferred to be ResponseTypeA
}
我可以做些什么来实现上述目标?
1条答案
按热度按时间nbnkbykc1#
我相信你正在寻找这样的东西:
Playground
在
sendMessageReturnResponse
中,仅推断Message
就足够了,然后允许您在Extract
的帮助下过滤联合类型这条线
Extract<ValidPairsMap, Pair<Msg, any>>
表示:从ValidPairsMap
的并集中获取消息为Msg
的对