【问题标题】:Is there a way to describe a Message type structure using generics?有没有办法使用泛型来描述消息类型结构?
【发布时间】:2021-12-28 19:30:34
【问题描述】:

【问题讨论】:

  • “任何字符串常量” - type: string 和“任何对象” - payload: any?你能澄清一下你在这里遇到了什么问题吗?另请注意,第一行的as const 完全没有意义——类型已经推断为'READY',因为它是const
  • 类型:字符串 类型:字符串常量
  • 假设您的实际意思是string literal type,那么:如果您有更具体的类型,请务必使用它。但同样不清楚实际问题是什么。你认为什么应该是通用的?类型参数来自哪里?
  • 声明阶段的模块不知道具体会用到哪些类型,所以请问如何用泛型来描述
  • 我只能建议阅读typescriptlang.org/docs/handbook/2/generics.html。也许您希望从某事中推断出payload: T,但不清楚您要解决什么问题,并且您似乎没有尝试使 anything 通用。

标签: typescript generics


【解决方案1】:

在我看来这就是你想要的:Message 创建者函数:

TS Playground

interface Message<Type extends string, Payload = unknown> {
   type: Type;
   payload: Payload;
}

function createMessage <Type extends string, Payload = unknown>(
  type: Type,
  payload = undefined as unknown as Payload,
): Message<Type, Payload> {
  return {type, payload};
}

const readyMessage = createMessage('READY', { prop: 'value' });
readyMessage.type // "READY"
readyMessage.payload // { prop: string }

const setMessage = createMessage('SET', { differentProp: 12 });
setMessage.type // "SET"
setMessage.payload // { differentProp: number }

const goMessage = createMessage('GO');
goMessage.type // "GO"
goMessage.payload // unknown

const okMessage = createMessage('OK', 'We did it!');
okMessage.type // "OK"
okMessage.payload // string

【讨论】:

  • 谢谢,我试试
  • 我不清楚我应该如何在库方法中描述消息类型? ` protected onMessage = (event: MessageEvent) => { return; }; `你能修一下矿场吗?
  • @Vadim onMessage = &lt;Type extends string, Payload&gt;(event: MessageEvent&lt;Message&lt;Type, Payload&gt;&gt;)
  • > 类型 'string' 不可分配给类型 '"READY"' shorturl.at/ehAW8
猜你喜欢
  • 2022-06-21
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2022-06-21
相关资源
最近更新 更多