2017-02-19 4 views
0

Я хотел бы сделать что-то вроде:Проверьте функция имеет несколько аргументов в module.exports

module.exports = (obj) => { 
    if (arguments.length > 1) { 
    throw new Error('Must only pass in single argument'); 
    } 
} 

Когда я вхожу аргументы, я получаю мета-данные о том, о самом модуле и не может видеть аргумент который был принят. Есть ли способ проверить, были ли приняты дополнительные аргументы?

Вот мой тест:

it('should reject multiple arguments',() => { 
    expect(fn({ data: 1}, { data: 2})).to.throw(Error, 'Too many inputs'); 
}); 

ответ

1

Как MDN's page on arrow function примечания: выражение функции

стрелка имеет более короткий синтаксис, чем выражение функции и не связывают свою собственную this, arguments, super, или new.target.

Другими словами, чтобы проверить, если функция стрелка получает больше аргументов, чем он ожидает, используя arguments не работает (как это было бы с нормальной функцией), так что вы должны использовать rest parameters:

const fn = (obj, ...restArgs) => { 
    if(restArgs.length > 0) { 
    // got more arguments than expected 
    throw new Error('Must only pass in single argument'); 
    } 
}; 
0

Как упоминалось выше, функция стрелки является причиной вашей проблемы.

Однако использование аргументов отдыха - это не очень хорошее решение, чтобы правильно определить ваш API в этом случае.

Чтобы сохранить совместимость с тем, что вы хотите (с указанием функции принимает только один аргумент), вы должны сделать:

module.exports = function (obj) { 
    if (arguments.length > 1) { 
    throw new Error('Must only pass in single argument'); 
    } 
} 

В функции стрелка, аргумент фактически привязан к чему-то вы не ожидали. См. https://github.com/unional/some-issues/tree/so-arrow-arguments за то, что он на самом деле делает.

+0

* «Однако использование аргументов« остальное »не является хорошим решением для правильного определения вашего API». * Не могли бы вы подробнее остановиться на этом вопросе? – Frxstrem

+0

Потому что 'function (obj, ... restArgs) {...}' предполагает, что эта функция принимает '... restArgs', в то время как цель состоит в том, чтобы запретить это. то есть API противоречит намерению. – unional

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