2016-05-30 23 views
11

Ho il seguente metodo di registrazione:tipografico opzionale tipo generico

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

Il requestData è opzionale, voglio essere in grado di chiamare logData senza dover specificare il tipo di S quando io non mando il requestData a il metodo: anziché: this.logData<T, any>('GET', data), voglio chiamare this.logData<T>('GET', data). C'è un modo per ottenere questo?

+0

Forse sovraccaricare la funzione? O forse prova a usare un parametro predefinito. –

+1

Non penso sia possibile sovraccaricare, se faccio qualcosa come 'private logData (operation: string, responseData: T)' e 'private logData (operazione: stringa, responseData: T, requestData: S)' I otterrà un errore di definizione della funzione duplicata – Marius

risposta

4

Come da dattiloscritto 2.2 (si può provare nel TS Playground), chiamando this.logData("GET", data) (con data di tipo T) ottiene dedotto con successo come this.logData<T, {}>("GET", data).

Il sovraccarico suggerito da David Bohunek può essere applicato se l'inferenza non riesce con la versione TS che si utilizza. In ogni caso, assicurarsi che la seconda firma sia prima dichiarata e poi definita, altrimenti non parteciperebbe ai sovraccarichi disponibili.

// 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

è possibile scrivere il metodo sovraccarico in questo modo:

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

Ma non credo che si ha realmente bisogno, perché non c'è bisogno di scrivere this.logData<T, any>('GET', data) invece basta scrivere this.logData('GET', data). Il tipo T sarà infered

20

A partire da TypeScript 2.3, è possibile utilizzare generic parameter defaults.

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

Anche se non è necessario perché l'inferenza dovrebbe funzionare comunque, +1 per utilizzare questa nuova funzionalità della lingua. – FstTesla

+0

Curioso se l'uso di 'S = never' impone il tipo get specificato quando viene utilizzato il parametro opzionale. – cchamberlain

+0

'S = any' dovrebbe consentire qualsiasi tipo –