什么,"提供的参数与呼叫目标的任何签名不匹配"是什么意思?

Gab*_*kel 14 typescript

我正在使用TypeScript处理Angular(1.4.9)应用程序.我正在做一个$ 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.");
        });
}
Run Code Online (Sandbox Code Playgroud)

但是,我想,"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.");
        });
}
Run Code Online (Sandbox Code Playgroud)

我觉得我很聪明.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.");
    });
Run Code Online (Sandbox Code Playgroud)

...我的应用程序运行正常.但是,编译器抛出了一个错误:"TS2346:提供的参数与调用目标的任何签名都不匹配." 考虑到这种情况,我想读一下就好像找不到方法一样.当我以原始方式拥有它时,它不会引起这种抱怨.你能解释一下这个错误是什么吗?为什么这个错误不能阻止编译?

Stu*_*0rn 22

错误信息实际上解释了什么是错误的.Method showAlert需要4个参数,并且所有参数都是必需的,但是在没有参数的情况下调用inside postIt方法.要使此编译器错误消失,您应该在调用或更新方法的签名时传递值,并使最后一个参数可选:showAlertalertTimeoutalertTimeoutshowAlert

public showAlert(alertType: string, alertTitle: string, 
    alertMessage: string, alertTimeout?: number): void {
    ...
}
Run Code Online (Sandbox Code Playgroud)