推断TypeScript中的依赖参数类型



消息有一种通用类型:

type Message = Message1 | Message2 | ...;

每个特定的消息类型都包含称为type的字段,例如:

type Message1 = {
type: 'message-1',
payload1: string;
}
type Message2 = {
type: 'message-2',
payload2: number;
}

subscribe函数应接受两个参数:messageTypeonMessage:

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);
});

你可以在操场上看。

相关内容

最新更新