web-dev-qa-db-fra.com

Type générique optionnel typescript

J'ai la méthode de journalisation suivante:

  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;
  }

La requestData est facultative. Je veux pouvoir appeler logData sans avoir à spécifier le type S lorsque je n'envoie pas requestData à la méthode: au lieu de: this.logData<T, any>('GET', data), je veux appeler this.logData<T>('GET', data). Y a-t-il un moyen d'y parvenir?

29
Marius

Conformément à TypeScript 2.2 (vous pouvez l’essayer dans le TS Playground), l’appel à this.logData("GET", data) (avec data de type T) est inféré avec succès sous la forme this.logData<T, {}>("GET", data).

La surcharge suggérée par David Bohunek peut être appliquée si l'inférence échoue avec la version TS que vous utilisez. Dans tous les cas, assurez-vous que la deuxième signature est déclarée et définie avant, sinon elle ne participerait pas aux surcharges disponibles.

// 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
}
8
FstTesla

A partir de TypeScript 2.3, vous pouvez utiliser paramètre générique par défaut .

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

Vous pouvez écrire la méthode de surcharge comme ceci:

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;
}

Mais je ne pense pas que vous en ayez vraiment besoin, car vous n'avez pas à écrire this.logData<T, any>('GET', data), mais simplement écrire this.logData('GET', data) Le type T sera déduit

1
David Bohunek