如何检查传递给函数的错误参数

问题描述:

我正在编写一个使用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

只需卸下型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