【问题标题】:TypeScript typing errors when piping/composing functions管道/组合函数时的 TypeScript 键入错误
【发布时间】:2021-06-15 00:40:34
【问题描述】:

当管道数据类型不同时,我会收到输入错误。如何满足 TypeScript?

const square = (x: number) => x * x

console.log(
  R.pipe(
    R.add, // two values
    square // one value
  )(1, 2)
)

[tsserver 2769] [E] 没有重载匹配这个调用。最后一个重载 出现以下错误。

'(x: number) => number' 类型的参数不可分配给 '(x: (b: number) => number) => number' 类型的参数。

参数“x”和“x”的类型不兼容。

Type '(b: number) => number' 不可分配给 type 'number'。

我安装了@types/ramda

【问题讨论】:

  • 您可以试试R.pipe(R.add, square)(1)(2) 看看是否有帮助?例如,将 1 和 2 分开到不同的括号对
  • @YaronGrushka 对参数进行柯里化会产生:[tsserver 2349] [E] 此表达式不可调用。 “号码”类型没有呼叫签名。 [tsserver 2554] [E] 预期 0 个参数,但得到 1 个。

标签: typescript eslint ramda.js


【解决方案1】:

这是一个不令人满意的解决方案,但它确实有效。我暂时用更简单类型的本地定义函数替换了R.add

const add = (a: number, b: number) => a + b
const square = (x: number) => x * x

console.log(
  R.pipe(
    add, // two values
    square // one value
  )(1, 2)
)

观察原始非编译示例 (<number, number>) 与这个简化示例 (<number, number, number, number>) 中 R.pipe 的实例化,我意识到 TypeScript 错误地选择了 R.add 的柯里化重载并感到困惑从那里。如果我们使用正确的总数量显式实例化 R.pipe,编译器会做出正确的决定:

const square = (x: number) => x * x

console.log(
  R.pipe<number, number, number, number>(
    R.add, // two values
    square // one value
  )(1, 2)
)

【讨论】:

    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 2017-12-17
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    相关资源
    最近更新 更多