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