2016-07-22 28 views
8

Ich schreibe ein Programm mit typescript und tslint als linter. Meine aktuellen Favoriten Liste der Regeln ist die folgende (tslint.json):So überprüfen Sie die falsche Anzahl von Parametern, die an eine Funktion übergeben werden

{ 
    "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 
    } 

} 

Obwohl ich Tslint bin mit versagt es eine Berufung auf eine Funktion, mit der falschen Anzahl von Parametern zu fangen. Zum Beispiel habe ich die folgende Funktion:

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

Und ich es nenne, wie diese in einer anderen Funktion mit aus:

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

Wie man sehen kann ich einen Parameter an die displayTimer Funktion am Übergang (in diesem Fall die Nummer 1, aber es könnte alles andere sein) und der Linter fängt das nicht ein.

+0

gut, das ist, weil es nicht ungültig JavaScript ist. Es ist durchaus zulässig, Werte, die Sie nicht als Parameter definiert haben, weiterzuleiten und später in der Funktion mit den ** Argumenten ** wiederzufinden. – toskv

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Ich komme aus einem Java/C# -Hintergrund, also möchte ich in der Lage sein, nach dieser Art von Mismatch zu suchen. Irgendwelche Ideen? – skiabox

+0

Vielleicht vermisse ich etwas, aber gibt es einen Grund, warum die Funktion nicht als 'function displayTimer(): void {'? Ich denke TS wäre besser in der Lage das zu überprüfen. Im Moment läuft alles, um zu tippen, "let displayTimer: Function = ???". Es weiß nicht, ob Sie irgendwann Null oder eine andere Funktion zuweisen werden. – Katana314

Antwort

5

Entfernen Sie einfach den Typ Function und Typoskript wird die Signatur überprüfen:

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

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

Die abgeleitete Art von displayTimer nicht Function ist (die alle Unterschriften akzeptiert), aber () => void.

Siehe the code in the PlayGround.

+0

Vielen Dank für Ihre Antwort. Sie hatten Recht mit Typescript-Compiler, der den Fehler erkennt, wenn ich die Funktionstyp-Deklaration lösche. Das Problem ist, dass mit diesen tslint-Regeln, sobald ich die Deklaration entferne, ich sehe, dass tslint über diese Entfernung klagt (TSLint : erwartete Variablendeklaration: 'displayTimer' hat eine typedef (typedef)) – skiabox

+0

Ihrem Vorschlag folgend, habe ich den folgenden Code verwendet, um einen Wert in der gleichen Zeile zu deklarieren und zuzuweisen.Es ist ein wenig hässlich, aber es funktioniert: 'Lassen Sie displayTimer :() => void = function(): void { document.getElementById ('Millisekunden'). innerHTML = ms.toString(); document.getElementById ('Sekunden'). InnerHTML = Sekunden.zuString(); document.getElementById ('Minuten'). InnerHTML = minutes.toString(); }; ' – skiabox

+0

@skiabox IMO, sollten Sie Inferenz verwenden, wo es verwendet werden kann. 'lass displayTimer:() => void = function(): void {/ * ... * /}' ist nicht DRY. – Paleo