Что означает "заданные параметры не соответствуют какой-либо сигнатуре целевого вызова"?

Я работаю над приложением Angular (1.4.9) с TypeScript. Я занимаюсь почтой $http и использую метод, чтобы вызвать предупреждение о успехе или неудаче на странице регистрации. Я понял, что мне придется перейти в контексте метода, который я использую, чтобы вызвать предупреждение, и поэтому, как правило, я бы сделал что-то вроде:

public showAlert(alertType: string, alertTitle: string, alertMessage: string, alertTimeout: number): void {
    this.alertShow = true;
    this.alertType = alertType;
    this.alertTitle = alertTitle;
    this.alertMessage = alertMessage;
    this.alertTimeout = alertTimeout;
}

public postIt(): void {
    that: any = this; // <-- See, I know what I'm doing.

    var url: string = "/";
    var user: any = {};

    this.$http.post(url, user)
        .then((data: any) => {
            that.showAlert("success", "Yes!", "You are registered.");
        })
        .catch((err: any) => {
            that.showAlert("warning", "Embarrassing...", "Problem on our end. Try again, later.");
        });
}

Но, тогда я подумал: "Разве не TypeScript достаточно умный, чтобы знать, что я делаю здесь, разве функции стрелок не заботятся об этом для меня?" Итак, я переключаю его:

public postIt(): void {
    // var that: any = this; <-- Boom! ...Commented out!

    var url: string = "/";
    var user: any = {};

    this.$http.post(url, user)
        .then((data: any) => {
            // it doesn't like the "this"
            this.showAlert("success", "Yes!", "You are registered.");
        })
        .catch((err: any) => {
            // it doesn't like the "this"
            this.showAlert("warning", "Embarrassing...", "Problem on our end. Try again, later.");
        });
}

Я думаю, что я довольно умный. TypeScript сотрудничает. Я проверил интерпретируемый JavaScript и сделал то, что я думал:

myClass.prototype.postIt = function () {
    // var that: any = this;
    var _this = this;
    var url = "/";
    var user = {};
    this.$http.post(url, user)
        .then(function (data) {
        _this.showAlert("success", "Yes!", "You are registered.");
    })
        .catch(function (err) {
        _this.showAlert("warning", "Embarrassing...", "Problem on our end. Try again, later.");
    });

... И мое приложение работает отлично. Но компилятор выдает мне ошибку: "TS2346: Поставляемые параметры не соответствуют какой-либо сигнатуре целевого вызова". Учитывая ситуацию, я хочу прочитать это, так как он не может найти метод. Когда у меня есть это оригинал, он не делает эту жалобу. Не могли бы вы объяснить, что это за ошибка? Почему эта ошибка не предотвращает компиляцию?

Ответ 1

Сообщение об ошибке на самом деле очень хорошо объясняет, что не так. Метод showAlert ожидает 4 параметра, и все они требуются, но внутри postIt метод showAlert вызывается без аргумента alertTimeout. Чтобы эта ошибка компилятора исчезла, вы должны либо передать значение alertTimeout при вызове showAlert, либо подписать подпись метода обновления и сделать последний параметр необязательным:

public showAlert(alertType: string, alertTitle: string, 
    alertMessage: string, alertTimeout?: number): void {
    ...
}

Ответ 2

Если вы добавили полуточку в конце любых разделов, вы увидите ту же ошибку. Я столкнулся с той же проблемой, что и в конце моего модуля в разделе imports в app.module.ts я добавил полуточку в конце одного модуля.

введите описание изображения здесь

Просто удаление полуколока из RouterModule.forRoot(APP_ROUTES); исправлено для меня.

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