首页 > 解决方案 > TS2554:预期 X 参数,但得到 Y w/函数重载

问题描述

首先,我的功能:

function randIntIncl(max: number): number;
function randIntIncl(min: number, max?: number): number {
    if(max === undefined) {
        max = min;
        min = 0;
    }
    return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive 
}

(信用MDN

像这样调用:

randIntIncl(1,9999)

我得到错误:

TS2554:预期 1 个参数,但得到 2 个。

TypeScript 匹配第一个重载,然后出错。我不明白为什么它不尝试第二次重载?9999显然是一个数字,所以它应该匹配,不是吗?

我可以简单地省略第一个重载,一切都会很好,因为max无论如何我都是可选的,但我把重载放在那里是为了文档的目的。当使用一个 arg 调用时,该 arg 是第二个重载所暗示的最大值而不是最小值。

所以我的问题是:

  1. 有没有办法使这项工作?我做错什么了吗?
  2. 还是这是“按设计”,我根本不应该创建模棱两可的重载?

标签: typescript

解决方案


当您有重载签名时,实际函数定义的签名是“实现签名”,它不算作重载签名。如果你想让它成为一个重载签名,你必须写两次。见手册


推荐阅读