Подтвердить что ты не робот

Typescript Функциональный интерфейс

Почему Typescript не предупреждает меня, что функция, которую я определяю, не соответствует объявлению интерфейса, но она предупреждает меня, если я пытаюсь вызвать функцию.

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.
4b9b3361

Ответ 1

Интерфейс гарантирует, что все вызывающие функции, реализующие интерфейс, снабжают требуемыми аргументами - data и toUpper.

Поскольку TypeScript понимает, что JavaScript не против, если вы передаете аргументы, которые не используются, он ловко разрешает это в реализациях.

Почему все в порядке? Потому что это означает, что вы можете заменить любую реализацию интерфейса, не затрагивая код вызова.

Пример. Вы можете заменить либо реализацию IFormatter, и код работает.

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

Если TypeScript этого не сделал, ваш upperCaseFormatter должен был иметь параметр toUpper, который не использовался нигде в функции, что делает код менее читаемым.