2013-12-10 2 views
8

У меня есть этот сценарий, файл t.ts:машинопись переменное число параметров в функции определения интерфейса 0.9.5

interface Itest{ 
    (event: any, ...args: any[]):any; 
    } 

    var t1: Itest = function (testparam) { return true;}; 
    var t2: Itest = function (testparam, para1) { return true; }; 
    var t3: Itest = function (testparam, para1, para2) { return true; }; 


    interface Itest2 { 
    (event: any, para1,...args: any[]): any; 
    } 
    var t4: Itest2 = function (testparam, para1) { return true; }; 
    var t5: Itest2 = function (testparam, para1, para2) { return true; }; 

Когда я компилирую это с TSC 0.9.5 я получаю следующие ошибки:

tsc --target ES5 "t.ts" 
t.ts(6,8): error TS2012: Cannot convert '(testparam: any, para1: any) => boolean' to 'Itest': 
    Call signatures of types '(testparam: any, para1: any) => boolean' and 'Itest' are incompatible: 
     Call signature expects 1 or fewer parameters. 
t.ts(7,8): error TS2012: Cannot convert '(testparam: any, para1: any, para2: any) => boolean' to 'Itest': 
    Call signatures of types '(testparam: any, para1: any, para2: any) => boolean' and 'Itest' are incompatible: 
     Call signature expects 1 or fewer parameters. 
t.ts(14,8): error TS2012: Cannot convert '(testparam: any, para1: any, para2: any) => boolean' to 'Itest2': 
    Call signatures of types '(testparam: any, para1: any, para2: any) => boolean' and 'Itest2' are incompatible: 
     Call signature expects 2 or fewer parameters. 

Я пропустил что-то или это не работает? Он работал в 0.9.1.1. благодаря!

+1

Это известное разрывное изменение 0.9.5 см [Остальные аргументы теперь правильно проверены на соответствие действительности) (https://typescript.codeplex.com/wikipage?title=Known%20breaking%20changes%20between%200.8%20and%200.9) – nemesv

ответ

13

Поскольку остальные параметры являются необязательными, вы должны сделать их по желанию в своих функциях, а также:

interface Itest{ 
    (event: any, ...args: any[]):any; 
    } 

    var t1: Itest = function (testparam?) { return true;}; 
    var t2: Itest = function (testparam?, para1?) { return true; }; 
    var t3: Itest = function (testparam?, para1?, para2?) { return true; }; 


    interface Itest2 { 
    (event: any, para1,...args: any[]): any; 
    } 
    var t4: Itest2 = function (testparam, para1) { return true; }; 
    var t5: Itest2 = function (testparam, para1, para2?) { return true; }; 

Это новое в TS0.9.5

+1

Спасибо за быстрый ответ :)! – hans

+0

На самом деле довольно просто очистить объект в формате REST, чем использовать переменные параметры, потому что с переменными параметрами у вас есть целые позиции вместо имен свойств/переменных, которые легко испортить, труднее читать и невозможно есть интерфейс, который проверяет, хотите ли вы. Поэтому вам не нужны переменные параметры, поскольку javascript делает объекты REST изначально. –

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