当将这些参数传递给类型化的函数时,为什么TypeScript不推断函数的参数类型?

chi

在以下示例中:

function functionA(x: string, y: number, z: SpecialType): void { }
const functionWrapper: (x, y, z) => functionA(x, y, z);

functionWrapper的参数键入为any有什么方法可以鼓励tsc从其用法中推断出其类型?TypeScript类型系统的哪些限制阻止了此问题的解决?

马西耶·西科拉(Maciej Sikora)

TypeScript类型分析以自上而下的方式工作。这意味着它等于程序数据流,在该数据流中,数据也是从上到下传递的。TypeScript正在分析控制流,但它使用的是从顶部而不是底部给出的信息。

考虑这样的函数示例:

function functionMaker(x: string, y: string) { 
    return () => x + y; 
}

上面的函数返回另一个函数。返回的匿名函数的定义中没有显式键入,但是TS能够分析functionMaker始终返回() => string的函数类型。

由于TS无法预测您将对参数执行的确切操作,因此无法进行另一种处理。考虑以下:

function functionA(x: string, y: number, z: SpecialType): void { }
function functionB(x: number): void { }
const functionWrapper: (x, y, z) => { 
  functionA(x, y, z);  // x should be string
  functionB(x); // x should be number
}

现在,TS有两个使用一个参数的函数,但是它们对类型的要求都不同。解决这个难题的任何方法都是错误的,因为一个或另一个功能将失败。

总而言之-类型分析是自上而下进行的。但是我们可以通过创建将包装另一个函数的通用函数来解决您的问题。

function functionA(x: string, y: number, z: SpecialType): void { }

const wrap = <X, Y, Z, R>(f: (x: X, y: Y, z: Z) => R) => (x: X, y: Y, z: Z): R => f(x,y,z);
const functionWrapper = wrap(functionA);

我们wrap被明确定义为包装器,这意味着其目的是从给定函数中推断类型并创建另一个具有相同参数和相同返回值的函数。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么Typescript无法推断此函数的参数类型?

来自分类Dev

将 char** 传递给 void** 函数参数时,与指针类型不兼容的指针类型警告

来自分类Dev

为什么将指针传递给具有常量指针类型参数的函数时不需要类型转换?

来自分类Dev

为什么在实现通用接口时TypeScript无法推断函数参数的类型?

来自分类Dev

typescript-将类型传递给函数参数

来自分类Dev

将“类型”参数传递给函数

来自分类Dev

传递内联函数调用时,TypeScript 不推断函数参数类型

来自分类Dev

为什么规范禁止将类类型传递给可变参数C ++函数?

来自分类Dev

为什么std :: bind静态地将类型检查参数传递给函数?

来自分类Dev

基于其参数类型的函数类型参数的TypeScript类型推断

来自分类Dev

推断函数的参数类型

来自分类Dev

传递重载的函数指针及其参数时的错误类型推断

来自分类Dev

将键传递给函数作为字符串参数时,VBA Excel错误“按参考参数类型不匹配”

来自分类Dev

为什么不能推断泛型函数的参数类型?

来自分类Dev

从函数参数推断类型参数

来自分类Dev

函数的类型推断作为 Typescript 中的参数

来自分类Dev

从枚举参数推断Typescript函数返回类型

来自分类Dev

如何将具有多种类型的参数作为参数传递给 Typescript 中的函数?

来自分类Dev

为什么在调用函数A时将参数传递给函数A中的函数B?

来自分类Dev

为什么在通用函数类型参数推断中,Scala无法将Null类型识别为T的子类型?

来自分类Dev

Typescript-可选参数验证不足以将类型作为参数传递给另一个函数时确定类型吗?

来自分类Dev

将类类型作为参数传递给类构造函数

来自分类Java

如何将类类型作为参数传递给函数?

来自分类Dev

将更多参数传递给这种类型的 python 函数

来自分类Dev

将`struct`作为类型名称传递给函数参数

来自分类Dev

将数据类型作为参数传递给函数

来自分类Dev

Typescript - 将函数及其参数传递给另一个函数并强制执行参数的数量和类型

来自分类Dev

类型构造函数参数推断

来自分类Dev

函数的类型推断作为参数

Related 相关文章

  1. 1

    为什么Typescript无法推断此函数的参数类型?

  2. 2

    将 char** 传递给 void** 函数参数时,与指针类型不兼容的指针类型警告

  3. 3

    为什么将指针传递给具有常量指针类型参数的函数时不需要类型转换?

  4. 4

    为什么在实现通用接口时TypeScript无法推断函数参数的类型?

  5. 5

    typescript-将类型传递给函数参数

  6. 6

    将“类型”参数传递给函数

  7. 7

    传递内联函数调用时,TypeScript 不推断函数参数类型

  8. 8

    为什么规范禁止将类类型传递给可变参数C ++函数?

  9. 9

    为什么std :: bind静态地将类型检查参数传递给函数?

  10. 10

    基于其参数类型的函数类型参数的TypeScript类型推断

  11. 11

    推断函数的参数类型

  12. 12

    传递重载的函数指针及其参数时的错误类型推断

  13. 13

    将键传递给函数作为字符串参数时,VBA Excel错误“按参考参数类型不匹配”

  14. 14

    为什么不能推断泛型函数的参数类型?

  15. 15

    从函数参数推断类型参数

  16. 16

    函数的类型推断作为 Typescript 中的参数

  17. 17

    从枚举参数推断Typescript函数返回类型

  18. 18

    如何将具有多种类型的参数作为参数传递给 Typescript 中的函数?

  19. 19

    为什么在调用函数A时将参数传递给函数A中的函数B?

  20. 20

    为什么在通用函数类型参数推断中,Scala无法将Null类型识别为T的子类型?

  21. 21

    Typescript-可选参数验证不足以将类型作为参数传递给另一个函数时确定类型吗?

  22. 22

    将类类型作为参数传递给类构造函数

  23. 23

    如何将类类型作为参数传递给函数?

  24. 24

    将更多参数传递给这种类型的 python 函数

  25. 25

    将`struct`作为类型名称传递给函数参数

  26. 26

    将数据类型作为参数传递给函数

  27. 27

    Typescript - 将函数及其参数传递给另一个函数并强制执行参数的数量和类型

  28. 28

    类型构造函数参数推断

  29. 29

    函数的类型推断作为参数

热门标签

归档