Pourquoi TypeScript ne m'avertit-il pas que la fonction que je définis ne correspond pas à la déclaration d'interface, mais il m'avertit si j'essaie d'appeler la fonction.
interface IFormatter {
(data: string, toUpper : boolean): string;
};
//Compiler does not flag error here.
var upperCaseFormatter: IFormatter = function (data: string) {
return data.toUpperCase();
}
upperCaseFormatter("test"); //but does flag an error here.
L'interface garantit que tous les appelants de fonctions qui implémentent l'interface fournissent les arguments requis - data
et toUpper
.
Parce que TypeScript comprend que JavaScript ne dérange pas si vous passez des arguments qui ne sont pas utilisés, il autorise intelligemment cela dans les implémentations.
Pourquoi est-ce que ça va? Parce que cela signifie que vous pouvez remplacer n'importe quelle implémentation de l'interface sans affecter le code appelant.
Exemple: vous pouvez remplacer l'implémentation IFormatter
et le code fonctionne.
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);
Si TypeScript ne faisait pas cela, votre upperCaseFormatter
devrait avoir un paramètre appelé toUpper
qui n'était utilisé nulle part dans la fonction - ce qui rend le code moins lisible.