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