【问题标题】:Typescript error when curried defition is after the uncurried definitioncurried 定义在 uncurried 定义之后时的打字稿错误
【发布时间】:2020-10-25 13:44:51
【问题描述】:

我收到错误:Expected 1 arguments, but got 2.ts(2554) 当我将方法的非咖喱定义放在咖喱定义之上时。

dtslint 测试失败:

function match(regExpression: RegExp, str: string): string[]; 
function match(regExpression: RegExp): (str: string) => string[]; 

function throttle<T, U>(fn: (input: T) => U, ms: number): (input: T) => U;
function throttle<T, Q, U>(
  fn: (input1: T, input2: Q) => U, ms: number
): (input1: T, input2: Q) => U;

it('match', () => {
    const fn = throttle(match, 1000)
    fn(/foo/,'foo bar')  // line of error
})

如果我将 curried match 定义移到 uncurried 定义之上,那么错误就会消失。

我的问题是我是否应该将非curried版本放在curried版本之后,还是throttle定义中有错误?


问题的上下文是为类似于ramda 的库编写 Typescript 定义。

【问题讨论】:

    标签: typescript definitelytyped


    【解决方案1】:

    Typescript 按从上到下的顺序检查重载签名(内部交叉类型)。当throttle 选择使用哪个签名来推断泛型参数(几乎与条件类型相同)时,它总是选择最后一个签名。

    TS类型系统的密切相关特性描述here

    当从具有多个调用签名的类型(例如重载函数的类型)进行推断时,会根据最后一个签名进行推断(这可能是最宽松的包罗万象的情况)。无法根据参数类型列表执行重载解析(这将要求我们支持任意表达式的 typeof,如 #6606 中所建议的那样,或类似的东西)。

    【讨论】:

    • 非常感谢
    猜你喜欢
    • 2018-06-05
    • 2017-12-22
    • 2018-04-20
    • 2021-09-27
    • 2018-09-11
    • 2018-01-05
    • 2019-05-01
    • 2016-11-06
    相关资源
    最近更新 更多