首页 > 解决方案 > 打字稿:带有可选参数的重载:“重载签名与函数实现不兼容。”

问题描述

我一直在尝试重载(最初尝试在打字稿中实现这个基本代理示例,没有像禁用一行类型检查这样的恶作剧,如果你们中的任何人已经解决了,请随意扰乱我,我已经学到了很多东西并且它得到了烦人,我似乎无法解决它)。

我在实验时遇到了一个问题。这是我的代码:

// "Overload signature is not compatible with function implementation." on first (in code) declaration
function strOrObj (samePar:object, obj:object):object|undefined;
function strOrObj (samePar:object, num:number):number|undefined;
function strOrObj (samePar:object, num?:number, obj?:object):object|number|undefined{
    console.log("obj="+obj, "num="+num);
    return obj? obj: num;
}

我必须undefined在实现上添加,因为编译器在查看实现时认为可能需要它。它没有要求我将其添加到覆盖中,但无论如何我还是做了实验。但是当我在实现中添加类型声明时,我得到了错误Overload signature is not compatible with function implementation.

我编译它的唯一方法是将实现声明中的任何参数声明为any,但这样它只会将每个给定类型填充到第一个可选参数中(num在这种情况下)。

所以问题是,这里有什么问题?如果您不确定是否会使用第一个参数,或者这可能是问题所在(这可能是因为 JS 实现的原因),是否有可能拥有多个可选参数?

抱歉,如果这是重复的,我能找到的唯一似乎适用的是 Github 上的问题,但修复似乎已合并到发布代码中。

标签: typescriptoverriding

解决方案


Typescript 允许您定义多个重载,但在实现中区分它们是您的工作,这就是实现签名必须与所有重载兼容的原因

function strOrObj (samePar:object, obj:object):object|undefined;
function strOrObj (samePar:object, num:number):number|undefined;
function strOrObj (samePar:object, numObj:number| object):object|number|undefined{
    if (typeof numObj === 'number') {
        return samePar
    } else {
        numObj
    }
}

推荐阅读