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

ski*_*box 8 javascript typescript tslint

我正在使用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
    }

}
Run Code Online (Sandbox Code Playgroud)

虽然我使用的是Tslint但它无法捕获一个参数数量错误的函数.例如,我有以下功能:

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

而我正在从另一个函数中调用它,如下所示:

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);
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将一个参数传递给displayTimer函数(在本例中为数字1但它可能是其他任何东西)并且linter没有捕获它.

Pal*_*leo 5

只需删除类型Function,TypeScript将检查签名:

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

displayTimer(1); // Error: Supplied parameters does not match any signature of call target
Run Code Online (Sandbox Code Playgroud)

推断类型displayTimer不是Function(它接受任何签名)但是() => void.

请参阅PlayGround中的代码.