2016-04-23 29 views
12

我正在使用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:提供的參數不匹配調用目標的任何簽名。」考慮到這種情況,我想閱讀它就像找不到方法。當我擁有它的原始方式,它不會做出這個投訴。你能解釋一下這個錯誤到底是什麼嗎?爲什麼不能防止編譯錯誤?

回答

18

錯誤信息實際上很好地解釋了什麼是錯誤的。方法showAlert需要4個參數,它們都是必需的,但是在postIt方法裏面調用showAlert而沒有alertTimeout參數。爲了使這個編譯器錯誤調用showAlert或更新方法的簽名時離開你要麼通過alertTimeout價值,並最後一個參數可選:

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

啊哈!我應該知道......這可以解決這個錯誤,但是如果我遇到這種問題,我已經閱讀過編譯器不能工作(顯然,它會的),然後,爲什麼沒有編譯器捕獲錯誤當我使用'that = this'(顯然,它不會)。 –

1

如果您有任何章節的結尾處添加一個分號,你會看到同樣的錯誤。我遇到同樣的問題,因爲我在的imports部分的一個模塊末尾添加了一個分號。

enter image description here

剛剛從RouterModule.forRoot(APP_ROUTES);移除分號固定對我來說。

注意:雖然它與OP的問題沒有關係,但對於在此頁面登陸的其他用戶共享同一個錯誤。

相關問題