Typescript:使用可选参数进行重载:“重载签名与函数实现不兼容。”

问题描述 投票:1回答:2

我一直在尝试重载(原本试图在打字稿中实现this basic proxy example而没有犯规技巧,比如在一条线上禁用类型检查,如果你们中的任何一个已经解决了,可以随意扰乱我,我已经学到了很多而且它让我很讨厌似乎无法解决它)。

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

// "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上的一个问题,但修复了seem to have been merged into the release code

typescript override
2个回答
1
投票

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
    }
}

0
投票

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

Typescript不允许根据类型选择给定参数的名称(没有明确地自己编写类型检查)。 Typescript中唯一的逻辑重载实现(至少截至目前)是检查重载是否适合输入和返回类型中的实现,以及选择适配覆盖以确定返回类型。

可选变量只是从右到左填充,忽略给定的类型。这是什么导致错误,因为即使是次要对象参数(“obj”)将在实现中的num变量中结束,并且编译器抱怨第二个参数永远不会是数字,因此过载签名无效。

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

© www.soinside.com 2019 - 2024. All rights reserved.