打字稿:带有可选参数的重载:“重载签名与函数实现不兼容。”

山姆96

我一直在尝试重载(起初试图在打字稿中实现此基本代理示例,而没有犯规之类的技巧,例如禁用一行中的类型检查,如果你们中的任何人解决了随意破坏我的事情,我已经学到了很多,恼人的是我似乎无法解决它)。

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

// "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上的一个问题,但修复程序似乎已合并到发行代码中

山姆96

@ titian-cernicova-dragomir在他的回答的评论中回答了我的实际回答。在这里,我写下了我根据他的回答和自己的测试得出的结论。

Typescript不允许根据给定参数的类型来选择给定参数的名称(无需自己明确编写类型检查)。Typescript(至少到目前为止)中唯一的逻辑重载实现是检查重载是否适合输入和返回类型中的实现,并选择合适的替代来确定返回类型。

可选变量只是从右到左填充,而不管给定类型。多数民众赞成在导致错误的原因,因为即使是辅助对象参数(“ obj”)也将最终出现在num实现中的变量中,并且编译器抱怨第二个参数永远不会是数字,因此重载签名无效。

您可以通过切换参数来进行测试,如果obj在实现中定义了第一个参数,它将抱怨第二个过载签名,因为第二个参数始终是一个对象。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章