2016-05-13 2 views
4

С машинописью или Facebook, Flow (типом) можно статический ввести такие переменные, какКак сгенерировать проверку типов в JavaScript во время выполнения?

function add (x: integer, y: integer) { ... } 

Оба машинописи и Flow поймать любой незаконный вызов, такие как add('1',0) в время компиляции.

Однако, когда библиотека скомпилирована и экспортирована, типы исчезли. Это означает, что потребитель библиотеки, использующий эту функцию, не получает ошибок, что может потенциально привести к трудным для отладки проблемам.

Есть ли способ автоматически генерировать дополнительный код, который будет вызывать точно такие же ошибки во время выполнения?

Я могу, конечно, вручную устанавливать ограждения каждый раз, когда ожидается проверка типа, но это кажется скучным и повторяющимся.

+0

Является ли это тестом потока на или машинописный вопрос? –

+0

@JanDvorak Я был бы рад использовать любую или любую другую технологию, которая решает проблему. –

+0

JS - динамически типизированный язык. Не пытайтесь сделать что-то из языка, а что нет. В противном случае вы подражаете процессу компиляции для КАЖДОГО запроса. Это безумно. Вместо этого применяйте интенсивные тесты модулей. Модульные тесты заменяют отсутствующий компилятор в JS. – rand

ответ

2

https://github.com/codemix/babel-plugin-typecheck делает то, что вы хотите.

Существует также https://gcanti.github.io/flowcheck/, но он немного заброшен.

Я лично не использовал ни одну из этих библиотек. Похоже, что они могут охватывать менее 100% синтаксиса Flow.

+0

Спасибо, действительно! Гораздо проще, чем TS-декораторы-мета-отражающие ... –

+0

Кто бы ни отклонил этот ответ, пожалуйста, предоставьте объяснение! –

+1

[babel-plugin-typecheck] (https://github.com/codemix/babel-plugin-typecheck) теперь устарел ... [flow-runtime] (https://codemix.github.io/flow-runtime /) является рекомендуемым преемником. – jbandi

0

Вы не получите это из javascript самостоятельно, независимо от того, какой вы выбираете, поскольку javascript не имеет понятия типов в этом смысле.

Я никогда не работал с потоком fb, поэтому я не могу ответить на это, но с машинописными текстами вот варианты, которые, как я думаю, у вас есть: (в порядке сложности и насколько это не имеет смысла)

  1. Изменить машинопись компилятор для автоматического добавления параметров во время выполнения проверки
    Вы можете use the compiler API и ввести фрагмент кода, который проверки на Params для функций. Компилятор скажет вам, что имена и типы параметров, если они являются необязательными и так далее.
    Я просто включаю это как вариант, но на мой взгляд это довольно запутанное решение.

  2. Запуск каждой функции с проверкой
    Довольно много, как и предыдущий, только что вы будете включать код самостоятельно в каждой функции, а не изменять компилятор для этого.
    Вы можете иметь глобальную функцию, которая принимает в качестве аргумента метаданные объявленных параметров и фактических аргументов, которые передаются.
    Это сделает вещи довольно уродливыми по коду и не будет забавным для поддержания.

  3. В случае классов, которые вы можете использовать декоратор
    The decorators feature довольно новый, но машинописный позволяет использовать его, и если вы хотите сделать это проверку вещи на классах, то это лучшее решение для вашей проблемы так далеко.

  4. Создать файл определения для вас библиотека
    Это самый лучший из вариантов, если вы спросите меня.
    Вам не нужно загрязнять ваш код проверками в каждой функции. Более того, вы никогда не сможете контролировать, кто использует вашу библиотеку или как они ее используют, поэтому она потеряна, а может даже попробовать.
    Для этого ваши потребители библиотеки должны будут писать самим машинописным текстом.

+0

Ничего себе, спасибо за такой подробный ответ! 1) выглядит пугающе, но хорошо знать, что он выходит; 2) не звучит забавно и, к сожалению, раздувает мои тесты; 3) выглядит очень интересно, у меня нет большого опыта работы с декораторами, последний пример (на странице декораторов рукописей) на самом деле не говорит, что именно произойдет, было бы здорово увидеть более подробное объяснение; 4) Я вижу вашу точку зрения, к сожалению, она блокирует любого потребителя в TS или непредсказуемые результаты риска ('11' против' 2' при добавлении ''1' + 1'). –

+0

Кто бы ни отклонил этот ответ, пожалуйста, предоставьте объяснение! –

1

Вы также можете попробовать babel-plugin-runtyper, который выполняет проверку типов во время выполнения и не требует ручных аннотаций.
Для примера, если функция выглядит следующим образом:

function add(x, y) { 
    return x + y; 
} 

И вы называете это как

add('1', 0); 

вы получите предупреждение в консоли:

Plus работы с различными типами: " 1 "(строка) + 0 (номер)

+1

Хороший инструмент, особенно, что не требуется замена кода - аккуратно! –

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