簡體   English   中英

打字稿:帶有可選參數的重載:“重載簽名與函數實現不兼容。”

[英]Typescript: Overload with optional paramters: "Overload signature is not compatible with function implementation."

我一直在嘗試重載(最初嘗試在打字稿中實現這個基本代理示例,而沒有像禁用在線類型檢查這樣的犯規技巧,如果你們中的任何人解決了這個問題,請隨意破壞我,我已經學到了很多東西煩人,我似乎無法解決它)。

我在嘗試時遇到了一個問題。 這是我的代碼:

// "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 上的問題,但修復似乎已合並到發布代碼中

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

@titian-cernicova-dragomir 在他的回答評論中回答了我的實際回答。 在這里,我寫下了我從他的回答和我自己的測試中得出的結論。

Typescript 不允許基於給定參數的類型選擇名稱(無需自己明確編寫類型檢查)。 在 Typescript 中實現的唯一邏輯重載(至少到目前為止)是檢查重載是否適合輸入和返回類型中的實現,以及選擇合適的覆蓋來確定返回類型。

可選變量只是從右到左填充,不考慮給定的類型。 這就是導致錯誤的原因,因為即使是次要對象參數(“obj”)也會在實現中的num變量中結束,並且編譯器抱怨第二個參數永遠不會是數字,因此重載簽名無效。

您可以通過切換參數來測試,如果您首先在實現中定義obj ,它會抱怨第二個重載簽名,因為第二個參數將始終是一個對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM