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

问题描述:

我正在使用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."); 
     }); 
} 

但是,那么我想,“难道不是't 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:提供的参数不匹配调用目标的任何签名。”考虑到这种情况,我想阅读它就像找不到方法。当我拥有它的原始方式,它不会做出这个投诉。你能解释一下这个错误到底是什么吗?为什么不能防止编译错误?

错误信息实际上很好地解释了什么是错误的。方法showAlert需要4个参数,它们都是必需的,但是在postIt方法里面调用showAlert而没有alertTimeout参数。为了使这个编译器错误调用showAlert或更新方法的签名时离开你要么通过alertTimeout价值,并最后一个参数可选:

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

啊哈!我应该知道......这可以解决这个错误,但是如果我遇到这种问题,我已经阅读过编译器不能工作(显然,它会的),然后,为什么没有编译器捕获错误当我使用'that = this'(显然,它不会)。 –

如果您有任何章节的结尾处添加一个分号,你会看到同样的错误。我遇到同样的问题,因为我在的imports部分的一个模块末尾添加了一个分号。

enter image description here

刚刚从RouterModule.forRoot(APP_ROUTES);移除分号固定对我来说。

注意:虽然它与OP的问题没有关系,但对于在此页面登陆的其他用户共享同一个错误。