关于 ts 中回调函数参数加上泛型限制后传入联合类型为什么会报错?
  VDvlWkTw2thq 2023年11月19日 31 0

相关代码如下,在 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 的类型调用相应的重载版本。这样可以消除类型不兼容的错误。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
VDvlWkTw2thq