【问题标题】:OpenTok event Typescript typingOpenTok 事件 Typescript 输入
【发布时间】:2021-09-04 02:01:37
【问题描述】:

我正在尝试通过OpenTok API 使用“信号”事件来发布/订阅来实现聊天。

这是我工作的事件监听器(接收到信号):

// Listen for signal CHAT_MESSAGE
sess.on('signal:CHAT_MESSAGE', event => {
 
  const message = event.data

  ...

}) 

问题是 typescript 无法将 event.data 识别为有效属性。类型来自 Session 类:

Session.signal: Event<'signal', Session> & {
    type?: string;
    data?: string;
    from: Connection;
};

我尝试从 Session 类中选择类型,例如

const message = event.data as Session['signal']

Typescript 抱怨 Property 'data' does not exist on type 'Event&lt;string, any&gt;'. 我怀疑是因为 TS 无法正确识别事件类型...

然后我尝试先转换为“未知”:

const signal = (event as unknown) as Session['signal']
const msg = signal.data

现在 TS 抱怨:Property 'data' does not exist on type '(signal: { type?: string | undefined; data?: string | undefined; to?: Connection | undefined; }, callback: (error?: OTError | undefined) =&gt; void) =&gt; void'.ts(2339)

我不知道为什么它不认为 data 是一个道具,同时它似乎说它是......

如何解决这个问题,最好不要禁用 TS 类型检查?

【问题讨论】:

标签: typescript opentok


【解决方案1】:

问题是Session['signal']是一个函数:

signal(
    signal: { type?: string, data?: string, to?: Connection },
    callback: (error?: OTError) => void
): void;

你可能需要的类型来自Session的类祖先OTEventEmitter

export class Session extends OTEventEmitter<{
    ...
    signal: Event<'signal', Session> & {
      type?: string;
      data?: string;
      from: Connection;
    };
    ...

OTEventEmitter.on 方法类型:

class OTEventEmitter<EventMap> {
    on<EventName extends keyof EventMap>(
        eventName: EventName,
        callback: (event: EventMap[EventName]) => void,
        context?: object
    ): void;

    on(
        eventName: string,
        callback: (event: Event<string, any>) => void,
        context?: object
    ): void;
    ...

Session 扩展OTEventEmitter 时,您可能会注意到EventMap 中没有signal:CHAT_MESSAGE。仅限signal

因此,如果您希望您的 signal:CHAT_MESSAGE 被视为 signal 事件,您应该将其写为:

sess.on('signal:CHAT_MESSAGE' as 'signal', event => {
    const message = event.data // no error
    // `event` has type
    // Event<'signal', Session> & {
    //     type?: string;
    //     data?: string;
    //     from: Connection;
    // }
    ...

这种类型转换没有运行时人工制品。唯一的目的是确保您的signal:CHAT_MESSAGE 事件与signal 的事件具有相同的结构。尽管像往常一样使用 as 关键字现在你有责任确保它是真实的。

【讨论】:

    猜你喜欢
    • 2021-12-30
    • 1970-01-01
    • 2023-01-29
    • 2016-11-15
    • 2018-06-25
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多