当前位置: 首页 > 知识库问答 >
问题:

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

赵骏奇
2023-11-08

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

declare function use<T>(data: T, cb: (arg: T) => void): voiddeclare function cb1(arg: string): voiddeclare function cb2(arg: number): voiduse('', cb1) // successuse(1, cb2) // successconst data: string | number = 9const cb: typeof cb1 | typeof cb2 = cb1use(data, cb) // error

共有1个答案

赫连靖琪
2023-11-08

你遇到的问题源于 TypeScript 的类型系统。在你的代码中,cb 函数的类型被定义为可以接受 stringnumber 类型的参数。然而,当你尝试将 cb 作为参数传递给 use 函数时,你传入的数据 data 实际上是一个 stringnumber 的联合类型。这就引发了类型不匹配的问题,因为 stringnumber 是两种不同的类型,不能直接相互转换。

解决这个问题的一种方式是使用类型断言。你可以明确地告诉 TypeScript,你确信 data 变量的确切类型就是 stringnumber,这样就可以消除类型不匹配的错误。

下面是一种可能的解决方案:

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); // successuse(1, cb2); // successconst data: string | number = 9;const cb: typeof cb1 | typeof cb2 = cb1; // you are sure that cb is either cb1 or cb2// use type assertionuse(data as string | number, cb); // success

在这个解决方案中,我们通过使用类型断言 as 来告诉 TypeScript,我们知道 data 的确切类型是 string | number,所以它应该可以安全地传递给 use 函数。这样,我们就可以保留泛型,同时解决了类型不匹配的问题。

 类似资料:
  • 问题总结:我想传递一个带有类型参数(如

  • 问题内容: 在下面的示例中,为什么编译器能够为in中的第一次调用推断出通用参数,而在第二次调用中却无法推断出通用参数?我正在使用Java 6。 (编译错误为 Nonsense.Bar类型的func(Nonsense.Foo)方法不适用于参数(Nonsense.Foo) )。 注意:我了解编译器错误可以通过test()中的第三行来解决-我很好奇是否存在阻止编译器推断类型的特定限制。这 似乎 对我有足

  • 关于TS类型推导中结果中,函数参数的类型问题? 链接在这里:https://tsplay.dev/mxE51W 问题是: 为什么在action中,调用cx('a')的时候,参数类型是never呢? 如何让cx根据传入的泛型T来决定接受的类型呢?

  • 下面的 test 函数返回了一个匿名函数,这个匿名函数接受一个泛型参数。 如上图所示,我该如何书写 TypeABC 的类型?

  • 我想使返回数据类型的的函数与传入的参数的数据类型相同。例如,我会这样调用函数: 因为我将一个传递给,所以它返回了一个

  • 这是我试图理解的编译器行为的一个过度简化版本: 在上面的代码片段中,是一个类型范围比HouseCat接口允许的类型范围更广的引用,即: 如果我尝试执行类似的操作,编译器会告诉我不满足类型参数的约束。那么,,至少是潜在的。 编译器不会让我创建违反类型参数约束的实例,但我对它使用作为引用上限的行为感到困惑。在(,)之间有一个无效的类型范围,那么编译器为什么不拒绝这个引用定义呢? 澄清:我的问题不是关于