如何确保传递给高阶函数的泛型函数具有void返回类型?

龙龙
function higherOrderFunction<P extends any[], R>(anyFunction: (...a: P) => R) {
  return (...args: P) => {
    anyFunction(...args); // anyFunction = lowerOrderFunction
  };
}

function lowerOrderFunction(name: string) {
  return '';
}

const higherOrderFunctionWithLowerOrderFunction = higherOrderFunction(lowerOrderFunction);
higherOrderFunctionWithLowerOrderFunction('x');

如何确保anyFunction会有void类型

这必须是传递给HigherOrderFunction泛型函数(此处泛型为“任何函数”),而不仅仅是lowerOrderFunction上面的示例足以添加:void

贾卡尔兹

TypeScript不想执行此操作,请参阅FAQvoid在需要void-returning函数的任何地方都可以使用返回非值的函数。在TypeScript中,void返回类型的意思是“您不应尝试使用此函数的返回值”,而不是“此函数实际上不返回值”。因此,此问题的最常规答案是您无需强制实施此类限制;如果anyFunction返回一个值,它将被忽略,应该没问题。


如果您真的想弯曲规则以便TypeScript强制执行限制,那么您可以做的一件事是:

function higherOrderFunction<P extends any[]>(anyFunction: (...a: P) => undefined | void) {
  return (...args: P) => { anyFunction(...args); };
}

通过指定undefined | void您的意思是说您将接受一个undefined返回值(应该可以,对吗?)或其他不返回的函数(void在联合中使用似乎规避了编译器的“任何值都可以”的逻辑):

higherOrderFunction(() => 1); // error, number is not undefined
higherOrderFunction(() => undefined); // okay
higherOrderFunction(() => console.log("this is void returning")); // okay

或者,如果您想使编译器甚至拒绝undefined-returning函数,则可以使用通用的签名来推断返回类型,然后使事情不起作用,除非它推断的类型是void

function higherOrderFunction<P extends any[], R>(
  anyFunction: (...a: P) => R & (void extends R ? void : never)
) {
  return (...args: P) => { anyFunction(...args); };
}

该类型的(void extends R ? void : never)计算结果void是否R为is voidnever否则为。这样您就会得到以下行为:

higherOrderFunction(() => 1); // error, number is not never
higherOrderFunction(() => undefined); // error, undefined is not never
higherOrderFunction(() => console.log("this is void returning")); // okay

这些方法“起作用”是因为它们对示例用例施加了限制,但是可能存在边缘情况。最明显的边缘情况是以下代码与无关,higherOrderFunction并且不会生成警告:

const thisIsAllowed: () => void = () => 1; // okay

毕竟,非无效返回函数可以分配给无效返回函数。现在,编译器将其thisIsAllowed视为void-returning函数。它已经忘记了一切1

因此,无论如何higherOrderFunction()定义以便“要求”void返回,这里都不会出现错误:

higherOrderFunction(thisIsAllowed); // no error

根据您的用例,这可能对您来说很麻烦。


我认为最好的做法可能是接受TypeScript的观点,即void返回类型意味着“忽略返回的任何值”而不是“不返回任何值”,然后继续。也许上述规则折弯方法仍然对您有用,但是您不应该依赖它们来禁止返回值的函数。


好吧,希望能有所帮助;祝好运!

游乐场链接

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将类型传递给泛型函数并进行比较

来自分类Dev

如何将可变实体传递给泛型函数?

来自分类Dev

快速类传递给泛型函数

来自分类Dev

rust-具有特征的泛型函数的返回类型

来自分类Dev

基于返回类型的Fortran泛型函数

来自分类Dev

泛型函数的TypeScript条件返回类型

来自分类Dev

Swift:检查泛型函数的返回类型

来自分类Dev

如何为具有类型约束的泛型函数提供默认参数?

来自分类Dev

如何在Flutter中将函数传递给泛型函数参数?

来自分类Dev

如何将泛型函数作为参数传递给另一个函数?

来自分类Dev

Swift:将类型从属性传递给泛型函数

来自分类Dev

如何查看传递给函数的函数指针是否返回 void?

来自分类Dev

为什么在具有可比约束的泛型函数中丢失泛型类型信息?

来自分类Dev

R模式修改传递给泛型函数的参数

来自分类Dev

斯威夫特:可等于字典不能传递给泛型函数

来自分类Dev

调用返回具有共享特征的不同类型并传递给其他函数的函数

来自分类Dev

作为TypeScript中泛型函数的参数类型的void

来自分类Dev

打字稿:如何从返回函数的输入参数推断高阶函数中的泛型类型

来自分类Dev

传递给泛型函数时如何访问@Published属性的包装值

来自分类Dev

如何将对象传递给TypeScript中的泛型函数

来自分类Dev

泛型函数返回图

来自分类Dev

如何在没有泛型类型参数的情况下定义泛型函数?

来自分类Dev

python高阶函数:带有参数列表的泛型函数调用

来自分类Dev

Typescript泛型函数不抱怨回调返回类型

来自分类Dev

Swift / iOS SDK:具有类类型/名称关闭/块问题的泛型函数

来自分类Dev

如何实现采用参数化特征的子类型并返回它的scala泛型函数

来自分类Dev

从泛型函数创建泛型类型

来自分类Dev

Kotlin - 具有泛型返回类型的抽象函数

来自分类Dev

在Swift中,返回相同类型的函数的泛型函数使我“无法显式专门化泛型函数”

Related 相关文章

  1. 1

    将类型传递给泛型函数并进行比较

  2. 2

    如何将可变实体传递给泛型函数?

  3. 3

    快速类传递给泛型函数

  4. 4

    rust-具有特征的泛型函数的返回类型

  5. 5

    基于返回类型的Fortran泛型函数

  6. 6

    泛型函数的TypeScript条件返回类型

  7. 7

    Swift:检查泛型函数的返回类型

  8. 8

    如何为具有类型约束的泛型函数提供默认参数?

  9. 9

    如何在Flutter中将函数传递给泛型函数参数?

  10. 10

    如何将泛型函数作为参数传递给另一个函数?

  11. 11

    Swift:将类型从属性传递给泛型函数

  12. 12

    如何查看传递给函数的函数指针是否返回 void?

  13. 13

    为什么在具有可比约束的泛型函数中丢失泛型类型信息?

  14. 14

    R模式修改传递给泛型函数的参数

  15. 15

    斯威夫特:可等于字典不能传递给泛型函数

  16. 16

    调用返回具有共享特征的不同类型并传递给其他函数的函数

  17. 17

    作为TypeScript中泛型函数的参数类型的void

  18. 18

    打字稿:如何从返回函数的输入参数推断高阶函数中的泛型类型

  19. 19

    传递给泛型函数时如何访问@Published属性的包装值

  20. 20

    如何将对象传递给TypeScript中的泛型函数

  21. 21

    泛型函数返回图

  22. 22

    如何在没有泛型类型参数的情况下定义泛型函数?

  23. 23

    python高阶函数:带有参数列表的泛型函数调用

  24. 24

    Typescript泛型函数不抱怨回调返回类型

  25. 25

    Swift / iOS SDK:具有类类型/名称关闭/块问题的泛型函数

  26. 26

    如何实现采用参数化特征的子类型并返回它的scala泛型函数

  27. 27

    从泛型函数创建泛型类型

  28. 28

    Kotlin - 具有泛型返回类型的抽象函数

  29. 29

    在Swift中,返回相同类型的函数的泛型函数使我“无法显式专门化泛型函数”

热门标签

归档