如何检查传递给函数的错误参数
我正在编写一个使用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,但它可能是其他任何东西)和棉绒不捕捉。
只需卸下型Function
和打字稿将检查签名:
let displayTimer = function(): void {
// ...
};
displayTimer(1); // Error: Supplied parameters does not match any signature of call target
推断类型的displayTimer
不Function
(其中接受任何签名),但() => void
。
谢谢你的回答。你是正确的打字稿编译器,检测到错误时,我删除函数类型声明。问题是,这些tslint规则一旦我删除声明,我看到tslint抱怨这种删除(TSLint :期望的变量声明:'displayTimer'有一个typedef(typedef)) – skiabox
按照你的建议,我用下面的代码来声明和分配一个值在同一行中。它有点难看,但它的工作原理:'let displayTimer :()=> void = function():void {document.getElementById('milliseconds')。innerHTML = ms.toString(); document.getElementById('seconds')。innerHTML = seconds.toString(); document.getElementById('minutes')。innerHTML = minutes.toString(); };' – skiabox
@skiabox IMO,你应该使用它可以使用的推论。 'let displayTimer:()=> void = function():void {/ * ... * /}'不是DRY。 – Paleo
嗯,那是因为它不是无效的JavaScript。将未定义的值作为参数传递,然后使用**参数**在函数中检索它们是完全有效的。 – toskv
感谢您指出这一点。我来自Java/C#的背景,所以我想能够检查这种类型的不匹配。任何想法? – skiabox
也许我错过了一些东西,但是有没有一个原因,该函数没有被声明为'function displayTimer():void {'?我认为TS能够更好地检查这一点。现在所有的输入工作都是'let displayTimer:Function = ???'。它不知道在某些时候您是否会重新分配null或其他函数。 – Katana314