web-dev-qa-db-fra.com

Interface de fonction dactylographiée

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.
52
MBeckius

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.

76
Fenton