简体   繁体   中英

How to check for wrong number of parameters passed to a function

I am writing a program using typescript and tslint as a linter. My current favorite list of rules is the following (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
    }

}

Although I am using Tslint it fails to catch a calling to a function with wrong number of parameters. For example I have the following function :

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

And I am calling it with from inside another function like this :

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);
};

As you can see I am passing a parameter to the displayTimer function (in this case the number 1 but it could be anything else) and the linter is not catching that.

Just remove the type Function and TypeScript will check the signature:

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

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

The inferred type of displayTimer is not Function (which accepts any signatures) but () => void .

See the code in the PlayGround .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM