2017-01-05 8 views
3

私のアプリケーションでは、何度も使用されているメソッドを持つサービスがあります。この方法は、(引数の名前/表示が私の例では関係ありません)ので、のような一連の引数を取ります....TypeScriptの引数シグニチャでnullの可能性のある引数を使用する

doSomething(url: string, data: any, qParams?: QueryParams) {} 

今、私はそうのようななどのオプションの引数を取るために、これを拡張する必要があります。

doSomething(url: string, data: any, qParams?: QueryParams, headers?: HeadersType) {} 

QueryParamsHeadersTypeは、私が書いた2つのカスタムタイプです。しかし、qParamsがヌルになり、ヘッダーにheadersTypeオブジェクトが含まれる場合があります。したがって、いくつかのケースでは私はheadersValなくqParamsValを持ちたい時に引数リストにNULL値を入れて持っ防ぐための最善の方法は何ですかのでdoSomething(urlValue, dataVal)またはdoSomething(urlVal, dataVal, qParamsVal)またはdoSomething(urlVal, dataVal, null, headersVal)またはdoSomething(urlVal, dataVal, qParamsVal, headersVal)

のようなメソッドを呼び出します。キーでオブジェクトを渡すことはできますが、スプレッド演算子などを使用できますか?私はTypeScriptを使用しており、私のアプリケーションはAngular2を使って書かれています。事前

答えて

1

多くのおかげでQueryParamsとHeadersTypeは、私が書かれている2つのカスタムタイプであることに注意してください。 [...] qParamsValではなくheadersValを持つときに、引数リストにnull値を入れないようにする最良の方法は何でしょうか

この場合、 overload signaturesdoSomething)。これは、メソッドの定義を少し複雑になりますが、クリーンコール・シグネチャ生成します:

// Callable signatures: 
doSomething(url: string, data: any, qParams?: QueryParams); 
doSomething(url: string, data: any, headers?: HeadersType); 
doSomething(url: string, data: any, qParams?: QueryParams, headers?: HeadersType); 

// Method implementation: 
doSomething(url: string, data: any, qParamsOrHeaders?: QueryParams | HeadersType, headers?: HeadersType) { 
    // The function body should determine which overload signature was used: 
    if (qParamsOrHeaders instanceof QueryParams && headers instanceof HeadersType) { 
     // used signature: (string, any, QueryParams, HeadersType) 
     // ... 
    } else if (qParamsOrHeaders instanceof HeadersType) { 
     // used signature: (string, any, HeadersType) 
     // ... 
    } else if (qParamsOrHeaders instanceof QueryParams) { 
     // used signature: (string, any, QueryParams) 
     // ... 
    } else { 
     // used signature: (string, any) 
     // ... 
    } 
} 

明らかに、これはQueryParamsHeadersTypeは、実際のクラス型であることを要求します。

2

4つの引数を持つ場合、4つのプロパティを持つオブジェクトとして渡すことができます。そのうちのいくつかはオプションです。メソッドを定義するとき

あなたは、メソッドを呼び出すためのさまざまな方法が

doSomething({url, data}) // when actual parameters names match args names exactly 

doSomething({url: urlVal, data: dataVal}); // when they don't 

doSomething({url: urlVal, data: dataVal, qParams: qParamsVal}); 

doSomething({url: urlVal, data: dataVal, headers: headersVal}); 

doSomething({url, data, qParams, headers: headersVal}); 

ようになりますので、あなたはパラメータのためのインタフェースを定義する必要があります、引数のために呼び出すときshorthand object literalを使用し、object destructuringことができ、

interface DoSomething { 
    url: string; 
    data: any; 
    qParams?: QueryParams; 
    headers?: HeadersType; 
} 
doSomething({url, data, qParams, headers}: DoSomething): void { 
    .... 
    if (qParams) { 
     .... 
    } 
} 

利点は、パラメータは常に名前が付けられていることである、とあなたが正確な順序を覚えて、どのように多くのNULL OPTIOのために挿入する必要はありませんので、あなたは関数を定義する際に、いくつかの名前の重複があるでしょうメソッドを呼び出すときの引数

関連する問題