L'interfaccia garantisce che tutti i chiamanti di funzioni che implementano l'interfaccia forniscono gli argomenti richiesti - data
e toUpper
.
Perché TypeScript riconosce che JavaScript non si preoccupa se si passano argomenti che non vengono utilizzati, abilmente consente questo nelle implementazioni.
Perché va bene? Perché significa che è possibile sostituire qualsiasi implementazione dell'interfaccia senza influire sul codice di chiamata.
Esempio: è possibile sostituire l'implementazione IFormatter
e il codice funziona.
interface IFormatter {
(data: string, toUpper : bool): string;
};
var upperCaseFormatter: IFormatter = function (data: string) {
return data.toUpperCase();
}
var variableCaseFormatter: IFormatter = function (data: string, toUpper: bool) {
if (toUpper) {
return data.toUpperCase();
}
return data.toLowerCase();
}
// Switch between these at will
//var formatter = upperCaseFormatter;
var formatter = variableCaseFormatter;
formatter("test", true);
Se dattiloscritto non lo ha fatto, il tuo upperCaseFormatter
avrebbe dovuto avere un parametro chiamato toUpper
che non è stato utilizzato ovunque nella funzione - il che rende il codice meno leggibile.
Tuttavia, l'uso di 'upperCaseFormatter' ha un valore booleano ridondante:' upperCaseFormatter ("test", true); // escludendo il 'true' si otterrà un warning del compilatore'. Quindi l'interfaccia è sbagliata e dovrebbe essere: 'interfaccia IFormatter {(data: string, toUpper?: Bool): string; } 'Ma questo significa che puoi invocare' variableCaseFormatter' con just 'variableCaseFormatter ('test');' senza specificare 'toUpper' nonostante sia nella firma della funzione. Vedi la mia domanda qui per un esempio più semplice della mia attuale confusione: http://stackoverflow.com/questions/23305020 – AJP
@AJP se stavi scrivendo codice pulito, non avresti mai scritto un formattatore di maiuscole/minuscole. Scriverei una classe per la parte superiore e una per quella inferiore ed evitare del tutto la brutta argomentazione booleana. – Fenton
@AJP Nel caso in cui si chiami 'upperCaseFormatter' direttamente l'interfaccia è irrilevante. –