1. ホーム
  2. generics

[解決済み] オプションの汎用タイプ

2022-10-12 10:32:43

質問

以下のようなロギングメソッドを持っています。

  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 はオプションです。 logData を指定することなく S を送信しない場合は requestData をメソッドに送ります: その代わりに this.logData<T, any>('GET', data) を呼び出したいのですが this.logData<T>('GET', data) .

これを実現する方法はあるのでしょうか?

どのように解決するのですか?

TypeScript 2.2(TSプレイグラウンドで試せます)では、TypeScriptで this.logData("GET", data) (を使うことができます。 data 型の T として推論されます。 this.logData<T, {}>("GET", data) .

使用するTSバージョンで推論が失敗する場合、David Bohunekによって提案されたオーバーロードを適用することができます。とにかく、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
}