首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推断TypeScript中的依赖参数类型

推断TypeScript中的依赖参数类型
EN

Stack Overflow用户
提问于 2021-06-25 19:24:00
回答 1查看 43关注 0票数 0

消息有一个泛型类型:

代码语言:javascript
复制
type Message = Message1 | Message2 | ...;

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

代码语言:javascript
复制
type Message1 = {
  type: 'message-1',
  payload1: string;
}

type Message2 = {
  type: 'message-2',
  payload2: number;
}

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

代码语言:javascript
复制
function subscribe(messageType: Message['type'], onMessage: (message: ???) => void): void {
   ...
}

问题是如何定义subscribe函数的第二个参数,以便onMessage回调可以推断消息的类型。例如,

代码语言:javascript
复制
subscribe('message-1', (msg) => { /* msg should be of type Message1 */ });
EN

回答 1

Stack Overflow用户

发布于 2021-06-25 21:27:44

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

代码语言:javascript
复制
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中查看它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68130189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档