2016-07-22 16 views
8

Piszę program używając maszynopisu i tslint jako liniowca. Mój obecny faworyt lista reguł jest następujący (tslint.json):Jak sprawdzić pod kątem złej liczby parametrów przekazanych do funkcji

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

} 

Chociaż używam Tslint nie udaje się złapać powołanie do funkcji z niewłaściwej liczby parametrów. Na przykład mam następującą funkcję:

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

I wzywam go od wewnątrz innej funkcji takich jak to:

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

Jak widać jestem przekazując parametr do funkcji displayTimer (w tym przypadku numer 1, ale może to być cokolwiek innego), a linter tego nie łapie.

+0

cóż, to dlatego, że nie jest nieprawidłowy javascript. jest całkowicie poprawne przekazywanie wartości, które nie zostały zdefiniowane jako parametry, a następnie pobieranie ich w funkcji za pomocą ** argumentów **. – toskv

+0

Dziękuję za wskazanie tego. Pochodzę z tła Java/C#, więc chcę mieć możliwość sprawdzenia tego typu niedopasowania. Jakieś pomysły? – skiabox

+0

Może brakuje mi czegoś, ale czy istnieje powód, dla którego funkcja nie jest zadeklarowana jako 'function displayTimer(): void {?? Myślę, że TS byłby w stanie to sprawdzić. Teraz wszystko, na co się pracuje, to wpisywanie: let displayTimer: Function = ??? '. Nie wie, czy w pewnym momencie zmienisz przydział null lub jakąś inną funkcję do niego. – Katana314

Odpowiedz

5

Wystarczy usunąć typ Function i maszynopis sprawdzi podpis:

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

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

wywnioskowaną rodzaj displayTimer nie jest Function (który przyjmuje żadnych podpisów), ale () => void.

Zobacz the code in the PlayGround.

+0

Dziękuję za odpowiedź. Masz rację co do kompilatora maszynopisów, który wykrywa błąd podczas usuwania deklaracji funkcji. Problem polega na tym, że z tymi regułami tslint, jak tylko usunę deklarację, widzę, że tslint narzeka na to usunięcie (TSLint : oczekiwana deklaracja zmiennych: "displayTimer", aby mieć typedef (typedef)) – skiabox

+0

Po Twojej sugestii użyłem następującego kodu, aby zadeklarować i przypisać wartość w tym samym wierszu.Jest trochę brzydka, ale działa: 'let displayTimer :() => void = function(): void { document.getElementById ('milliseconds'). innerHTML = ms.toString(); document.getElementById ('seconds'). InnerHTML = seconds.toString(); document.getElementById ("minuty"). InnerHTML = minutes.toString(); }; ' – skiabox

+0

@skiabox IMO, powinieneś użyć wnioskowania, gdzie można go użyć. 'let displayTimer:() => void = function(): void {/ * ... * /}' is not DRY. – Paleo

Powiązane problemy