首页 > 解决方案 > 使用映射类型在 TypeScript 中实现消息处理程序

问题描述

我正在尝试通过利用映射类型来实现消息处理程序。问题是handleMessage下面的函数无法编译。我理解它为什么不进行类型检查,但我认为这是一个合理的用例。甚至可以handleMessage在 TypeScript 中实现或类似吗?

type Message = { id: "A", value: string } | { id: "B", value: number };
type MessageIds = Message["id"];
type MessageCase<K extends MessageIds> = Message & { id: K };

type MessageHandler<K extends MessageIds> = (message: MessageCase<K>) => MessageCase<K>;

type MessageHandlers = {
    readonly [K in MessageIds]: MessageHandler<K>;
}

const messageHandlers: MessageHandlers = {
    A(message: MessageCase<"A">): MessageCase<"A"> {
        return {
            id: "A",
            value: message.value.toUpperCase(),
        };
    },

    B(message: MessageCase<"B">): MessageCase<"B"> {
        return {
            id: "B",
            value: message.value * 2,
        };
    },
};

function handleMessage<K extends MessageIds>(message: MessageCase<K>): MessageCase<K> {
    return messageHandlers[message.id](message);
}

标签: typescripttypesmapped-types

解决方案


推荐阅读