【问题标题】:Infer dependant parameter type in TypeScript在 TypeScript 中推断依赖参数类型
【发布时间】:2021-09-08 19:12:52
【问题描述】:

消息有一个通用类型:

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

【问题讨论】:

    标签: typescript type-inference typescript-generics


    【解决方案1】:

    要使用模型本身中的描述符来实现这一点,您可以进行通用切换以推断正确的模型。

    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中查看。

    【讨论】:

    • 谢谢!我想知道是否有办法不添加这种附加类型。此解决方案有效,但违反了单一事实来源的概念。
    猜你喜欢
    • 2016-12-05
    • 2021-04-28
    • 1970-01-01
    • 2018-12-13
    • 2020-03-11
    • 2021-04-15
    • 2019-04-26
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多