如何解决OpenTok 事件打字稿打字
我正在尝试使用“信号”事件发布/订阅通过 OpenTok API 实现聊天。
这是我的事件侦听器,它可以工作(接收到信号):
// Listen for signal CHAT_MESSAGE
sess.on('signal:CHAT_MESSAGE',event => {
const message = event.data
...
})
问题是打字稿无法将 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<string,any>'.
我怀疑这是因为 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) => void) => void'.ts(2339)
我不知道为什么它不认为 data
是一个道具,同时它似乎说它是......
如何解决这个问题,最好不要禁用 TS 类型检查?
解决方法
问题是 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
extends OTEventEmitter
时,signal:CHAT_MESSAGE
中没有 EventMap
。只有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
关键字,但您现在有责任确保这一点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。