消息有一个泛型类型:
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 */ });发布于 2021-06-25 21:27:44
要使用模型本身中的描述符来实现这一点,您可以进行通用切换以推断正确的模型。
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);
});您可以在playground中查看它。
https://stackoverflow.com/questions/68130189
复制相似问题