2017-09-13 47 views
0

我有一個函數有一些重載。TypeScript重載和可選參數

function foo(x: number, y: void): void; 
function foo(x: number, y: number | string): number; 
function foo(x: number, y: any) { 
    if (typeof y === "undefined") { 
     return; 
    } 
    return typeof y === "string" 
     ? x/parseFloat(y) 
     : x/y; 
} 

除了使用可選的參數爲y的,我專門用void指定返回值。預期用例包括用undefined作爲第二個參數調用的用例。

在另一個函數,我將它稱爲像這樣:

function bar(x: number, y?: number | string) { 
    const f = foo(x, y); 
    // Some other stuff 
} 

這將導致以下類型的錯誤:

Argument of type 'string | number | undefined' is not assignable to parameter of type 'string | number'. 
    Type 'undefined' is not assignable to type 'string | number'. 

我的理解是foo將採取的第二個參數中string | number | void,並且當bar調用它時,它將通過string,numbervoid,TypeScript將清楚foo' s的回報值。

達到預期效果的正確方法是什麼?

回答

1

編譯器沒有辦法知道bar中的y將是number | string還是undefined,因爲兩者都是可能的。如果編譯器無法解決這個問題,則無法選擇正確的過載。你必須提供給編譯器更多的幫助:

斷言y永遠不能undefined

function bar(x: number, y?: number | string) { 

    // Picks `function foo(x: number, y: number | string): number;` overload 
    const f = foo(x, y!); // Use the non-null assertion operator here. 
    // Some other stuff 
} 

或者使用type guards

function bar(x: number, y?: number | string) { 

    if (y === undefined) { 
     // Picks `function foo(x: number, y: void): void;` overload 
     foo(x, y); 
    } 
    else { 
     // Picks `function foo(x: number, y: number | string): number;` overload 
     const a = foo(x, y); 
    } 
    // Some other stuff 
}