2017-09-13 9 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を第2引数として呼び出したユースケースが含まれます。別の関数で

が、私はそうのようにそれを呼び出します。

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,number、またはvoidのいずれかが渡され、TypeScriptはfoo '戻り値。

意図した効果を達成する正しい方法は何ですか?

答えて

1

bar内のynumber | stringまたはundefinedのいずれかになる可能性があることをコンパイラが知る方法はありません。コンパイラがこれを理解できない場合、正しいオーバーロードを選択する方法はありません。あなたは、コンパイラに詳細なヘルプを提供する必要があります。

アサートyundefinedなることはないという。

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 
} 
関連する問題