2016-05-30 21 views
11
私は次のログ方法をしている

活字体の任意のジェネリック型

private logData<T, S>(operation: string, responseData: T, requestData?: S) { 
    this.logger.log(operation + ' ' + this.url); 
    if (requestData) { 
     this.logger.log('SENT'); 
     this.logger.log(requestData); 
    } 
    this.logger.log('RECEIVED'); 
    this.logger.log(responseData); 
    return responseData; 
    } 

requestDataはオプションで、私は私がrequestDataを送信しないときSタイプを指定することなくlogDataを呼び出すことができるようにしたいですメソッド:の代わりに:this.logData<T, any>('GET', data)、私はthis.logData<T>('GET', data)に電話したいと思います。これを達成する方法はありますか?

+0

代わりに機能がオーバーロードされる可能性がありますか?または、デフォルトのパラメータを使用してみてください。 –

+1

私は 'private logData (operation:string、responseData:T)'と 'private logData (operation:string、responseData:T、requestData:S)のような処理をすると、オーバーロードする可能性はありません。 – Marius

答えて

4

をinferedされます。

David Bohunekが提案したオーバーロードは、推論が使用するTSバージョンで失敗した場合に適用できます。とにかく、2番目の署名が宣言され、定義されていることを確認します。それ以外の場合は、使用可能なオーバーロードに参加しません。

// Declarations 
private logData<T>(operation: string, responseData: T); 
private logData<T, S>(operation: string, responseData: T, requestData?: S); 
// Definition 
private logData<T, S>(operation: string, responseData: T, requestData?: S) { 
    // Body 
} 
0

あなたは、このようにオーバーロードメソッドを書くことができます:

private logData<T>(operation: string, responseData: T); 
private logData<T, S>(operation: string, responseData: T, requestData?: S) { 
    this.logger.log(operation + ' ' + this.url); 
    if (requestData) { 
     this.logger.log('SENT'); 
     this.logger.log(requestData); 
    } 
    this.logger.log('RECEIVED'); 
    this.logger.log(responseData); 
    return responseData; 
} 

しかし、私はあなただけthis.logData('GET', data)を書く代わりにthis.logData<T, any>('GET', data)を記述する必要はありませんので、あなたが本当に、それを必要とは思いません。 Tタイプはthis.logData<T, {}>("GET", data)として正常に推測されます(タイプTdataで)this.logData("GET", data)を呼び出して、(あなたがTS遊び場でそれを試すことができます)活字体2.2を1として

20

generic parameter defaultsを使用できます。

private logData<T, S = {}>(operation: string, responseData: T, requestData?: S) { 
    // your implementation here 
} 
+0

重複した関数定義エラーが発生します。推論はとにかく動作するはずなので、不要ですが、言語のこの新機能を使用するには+1してください。 – FstTesla

+0

'S = never'を使用するのが面白い場合は、オプションのパラメータが使用されているときに指定された型getを強制します。 – cchamberlain

+0

'S = any'は任意の型を許可する必要があります –

関連する問題