消息有一种通用类型:
type Message = Message1 | Message2 | ...;
每个特定的消息类型都包含称为type
的字段,例如:
type Message1 = {
type: 'message-1',
payload1: string;
}
type Message2 = {
type: 'message-2',
payload2: number;
}
subscribe
函数应接受两个参数:messageType
和onMessage
:
function subscribe(messageType: Message['type'], onMessage: (message: ???) => void): void {
...
}
问题是如何定义subscribe
函数的第二个参数,以便onMessage
回调可以推断消息的类型。例如,
subscribe('message-1', (msg) => { /* msg should be of type Message1 */ });
要通过模型本身中的描述符实现这一点,可以进行通用切换来推断正确的模型。
type Message = MessageOne | MessageTwo;
type MessageOne = {
type: 'message-1',
payload1: string;
}
type MessageTwo = {
type: 'message-2',
payload2: number;
}
type GenericMessage<T extends Message['type']> =
T extends 'message-1' ? MessageOne :
T extends 'message-2' ? MessageTwo :
never;
function subscribe<Type extends Message['type']>(messageType: Type, onMessage: (message: GenericMessage<Type>) => void): void {
throw new Error('function "subscribe" is not implemented');
}
subscribe('message-1', (message) => {
console.log(message.payload1);
});
subscribe('message-2', (message) => {
console.log(message.payload2);
});
你可以在操场上看。