2016-07-22 8 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 = ???'です。ある時点で、ヌルや他の関数をそれに再割り当てするかどうかはわかりません。 – Katana314

答えて

5

だけタイプFunctionを除去し、活字体は、署名をチェックします:displayTimer

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

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

推論タイプFunction(任意の署名を受け入れる)が、() => voidありません。

the code in the PlayGroundを参照してください。

+0

答えていただきありがとうございます。関数型宣言を削除すると、エラーを検出するtypescriptコンパイラについて正しくありました。問題は、宣言を削除するとすぐにこれらの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

関連する問題