OpenTok 事件打字稿打字

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res