2016-07-22 3 views
8

Я пишу программу с использованием машинописных шрифтов и 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

Возможно, мне что-то не хватает, но есть причина, по которой функция не объявляется как функция displayTimer(): void {'? Я думаю, что TS лучше сможет это проверить. Прямо сейчас все, что нужно для ввода, это «let displayTimer: Function = ???'. Он не знает, будет ли в какой-то момент переназначить нуль или какую-то другую функцию. – Katana314

ответ

5

Просто удалите тип Function и машинопись проверит подпись:

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

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

Предполагаемая тип displayTimer не Function (который принимает любые подписи), но () => void.

См. the code in the PlayGround.

+0

Спасибо за ваш ответ. Вы были правы в машинописном компиляторе, который обнаруживает ошибку, когда я удаляю объявление типа функции. Проблема в том, что с этими правилами tslint, как только я удаляю объявление, я вижу, что tslint жалуется на это удаление (TSLint : объявление ожидаемой переменной: «displayTimer» для typedef (typedef)) – skiabox

+0

Следуя вашему предложению, я использовал следующий код, чтобы объявить и присвоить значение в той же строке. Это немного уродливо, но оно работает: 'let displayTimer :() => void = function(): void { document.getElementById ('миллисекунды'). 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

Смежные вопросы