首页 > 其他分享 >关于 ts 中回调函数参数加上泛型限制后传入联合类型为什么会报错?

关于 ts 中回调函数参数加上泛型限制后传入联合类型为什么会报错?

时间:2023-11-08 21:33:21浏览次数:37  
标签:use string void ts number 函数参数 cb1 报错 data

相关代码如下,在 use 函数中加入联合类型后就会告诉我 number 和 string 类型不兼容,求教应该怎样解决这个问题,换个写法的话我想要的是保留 use 的泛型

declare function use<T>(data: T, cb: (arg: T) => void): void

declare function cb1(arg: string): void
declare function cb2(arg: number): void

use('', cb1) // success
use(1, cb2) // success

const data: string | number = 9
const cb: typeof cb1 | typeof cb2 = cb1

use(data, cb) // error

根据提供的代码和问题描述,我注意到在 use 函数中你使用了泛型 <T>,同时你将 data 定义为类型为 string | number 的联合类型,cbtypeof cb1 | typeof cb2 的联合类型。

在使用 use(data, cb) 这一行代码中,TypeScript 编译器无法确定 data 的类型是 string 还是 number,因此它会将 data 的类型推断为 string | number。然而,联合类型 string | number 并不适用于接受 arg: T 参数的回调函数 cb

解决这个问题的一种方法是,你可以使用函数重载来定义多个 use 函数的签名,以适应不同类型的参数。下面是一个可能的解决方案:

declare function use<T>(data: string, cb: (arg: string) => void): void
declare function use<T>(data: number, cb: (arg: number) => void): void

declare function cb1(arg: string): void
declare function cb2(arg: number): void

use('', cb1) // success
use(1, cb2) // success

const data: string | number = 9
const cb: typeof cb1 | typeof cb2 = cb1

if (typeof data === 'string') {
  use(data, cb1)
} else {
  use(data, cb2)
}

在这个解决方案中,我们根据参数类型重载了 use 函数,并根据 data 的类型调用相应的重载版本。这样可以消除类型不兼容的错误。

标签:use,string,void,ts,number,函数参数,cb1,报错,data
From: https://blog.51cto.com/M82A1/8259155

相关文章

  • 今天运行sql文件时报错问题分析
    [SQL]Querysupermarketstart[ERR]1046-Nodatabaseselected[ERR]--�����û���createtableadmin(idintnotnullauto_increment,usernamevarchar(20)notnull,passwordvarchar(50)null,constraintuser_pkprimarykey(id))comment'ϵͳ�û�......
  • Exception.printStackTrace()转换为String输出
    packagecom.test1;importjava.io.PrintWriter;importjava.io.StringWriter;publicclassT010{/***@paramargs*/publicstaticvoidmain(String[]args){try{String[]arr={"111&qu......
  • 软件测试|好用的pycharm插件推荐(三)——Rainbow Brackets
    简介我们平时写代码的时候,括号是让我们非常头疼的地方,特别是代码逻辑很多,层层嵌套的情况。一眼很难看出,代码是从哪个括号开始,到哪个反括号结束的。这个时候要是有一款工具能够让我们一眼就看出代码从哪个括号开始,到哪个反括号结束,无疑对我们会有很大帮助。PyCharmRainbowBra......
  • PO系列 配置消息报错自动发送邮件(转)
    一前言PO(/PI)是SAP公司的一个中间件产品,用来辅助连接SAP系统与外围系统.(当然外围系统之间也可以使用PO).企业通过PO提供统一的中间件服务平台,所有系统都调用PO的服务或者发布服务让PO调用.如果PO处理消息时出现报错信息,可以通过PO的消息监控器查看报错的消息.这种方式依......
  • OGG-00730报错处理
    问题概述在ogg的迁移过程中,启动抽取进程后,出现如下报错:ERROROGG-00730Nominimumsupplementalloggingisenabled.Thismaycauseextractprocesstohandlekeyupdateincorrectlyifkeycolumnisnotinfirstrowpiece.问题原因根据报错提示,当前数据库不是最细log......
  • Balance Addicts 题解
    BalanceAddicts题目大意给定序列\(a\),求有多少种合法的划分方案。定义一种划分方案是合法的当且仅当划分出的各段序列的和构成回文序列。思路分析一种不太一样的做法。我们先对\(a\)做一遍前缀和,得到\(s\)。观察各段序列的和形式:\[s_{p_1},s_{p_2}-s_{p_1},s_{p_3}......
  • TSINGSEE智能分析网关V4车辆结构化数据检测算法及车辆布控
    车辆结构化视频AI检测技术,可通过AI识别对视频图像中划定区域内的出现的车辆进行检测、抓拍和识别,系统通过视频采集设备获取车辆特征信息,经过预处理之后,接入AI识别算法并与车辆底库进行对比,快速识别车辆身份和属性。TSINGSEE青犀AI智能分析网关V4在车辆的智能监管上,也具备十分灵活......
  • TSINGSEE青犀AI智能分析网关V4人员离岗识别算法的说明及应用
    人员离岗AI识别算法,是基于计算机视觉深度学习神经网络技术,通过配合现场部署的监控摄像头,自动识别人员是否在工位或作业区域内,结合离岗时间的配置,可以触发人员离岗告警。该算法目前可应用在监控室、、值班室、中控室工厂、工地等多样化场景中。随着安防领域及AI视频技术的发展,人员离......
  • 使用TS进行Vue-Router的Meta类型扩展
    目录1、前言2、解决1、前言使用Vue-Router时,会将一些字段信息附加到路由的Meta对象里面,比如图标icon,标题,权限等,如下:{path:'/billboard/board/:boardId',name:'billboardBoard',props:true,component:()=>import('@/views/billboard/board.vue'),meta:{......
  • TSINGSEE青犀AI智能分析网关V4人员离岗识别算法的说明及应用
    人员离岗AI识别算法,是基于计算机视觉深度学习神经网络技术,通过配合现场部署的监控摄像头,自动识别人员是否在工位或作业区域内,结合离岗时间的配置,可以触发人员离岗告警。该算法目前可应用在监控室、、值班室、中控室工厂、工地等多样化场景中。随着安防领域及AI视频技术的发展,人员......