2016-07-22 106 views
8

我正在編寫一個使用typescript和tslint作爲linter的程序。 我目前的規則最愛列表如下(tslint.json):如何檢查傳遞給函數的錯誤參數

{ 
    "extends": "tslint:recommended", 

    "rules": { 
     "comment-format": [false, "check-space"], 
     "eofline": false, 
     "triple-equals": [false, "allow-null-check"], 
     "no-trailing-whitespace": false, 
     "one-line": false, 
     "no-empty": false, 
     "typedef-whitespace": false, 
     "whitespace": false, 
     "radix": false, 
     "no-consecutive-blank-lines": false, 
     "no-console": false, 
     "typedef": [true, 
      "variable-declaration", 
      "call-signature", 
      "parameter", 
      "property-declaration", 
      "member-variable-declaration" 
     ], 
     "quotemark": false, 
     "no-any": true, 
     "one-variable-per-declaration": false 
    } 

} 

雖然我使用Tslint它未能趕上調用​​與錯誤數量的參數的函數。 例如我有以下功能:

let displayTimer: Function = function(): void { 
    document.getElementById('milliseconds').innerHTML = ms.toString(); 
    document.getElementById('seconds').innerHTML = seconds.toString(); 
    document.getElementById('minutes').innerHTML= minutes.toString(); 
}; 

而且我與調用它這樣從另一個函數內部:

let turnTimerOn: Function = function(): void { 

    ms += interval; 

    if (ms >= 1000) 
    { 
     ms = 0; 
     seconds += 1; 
    } 

    if (seconds >= 60) 
    { 
     ms = 0; 
     seconds = 0; 
     minutes += 1; 
    } 

    displayTimer(1); 
}; 

正如你可以看到我傳遞的一個參數displayTimer功能(在這種情況下,數字1,但它可能是其他任何東西)和棉絨不捕捉。

+0

嗯,那是因爲它不是無效的JavaScript。將未定義的值作爲參數傳遞,然後使用**參數**在函數中檢索它們是完全有效的。 – toskv

+0

感謝您指出這一點。我來自Java/C#的背景,所以我想能夠檢查這種類型的不匹配。任何想法? – skiabox

+0

也許我錯過了一些東西,但是有沒有一個原因,該函數沒有被聲明爲'function displayTimer():void {'?我認爲TS能夠更好地檢查這一點。現在所有的輸入工作都是'let displayTimer:Function = ???'。它不知道在某些時候您是否會重新分配null或其他函數。 – Katana314

回答

5

只需卸下型Function和打字稿將檢查簽名:

let displayTimer = function(): void { 
    // ... 
}; 

displayTimer(1); // Error: Supplied parameters does not match any signature of call target 

推斷類型的displayTimerFunction(其中接受任何簽名),但() => void

請參閱the code in the PlayGround

+0

謝謝你的回答。你是正確的打字稿編譯器,檢測到錯誤時,我刪除函數類型聲明。問題是,這些tslint規則一旦我刪除聲明,我看到tslint抱怨這種刪除(TSLint :期望的變量聲明:'displayTimer'有一個typedef(typedef)) – skiabox

+0

按照你的建議,我用下面的代碼來聲明和分配一個值在同一行中。它有點難看,但它的工作原理:'let displayTimer :()=> void = function():void {document.getElementById('milliseconds')。innerHTML = ms.toString(); document.getElementById('seconds')。innerHTML = seconds.toString(); document.getElementById('minutes')。innerHTML = minutes.toString(); };' – skiabox

+0

@skiabox IMO,你應該使用它可以使用的推論。 'let displayTimer:()=> void = function():void {/ * ... * /}'不是DRY。 – Paleo