React - использование TypeScript vs Flow vs?

В настоящее время я изучаю React и думаю, что хорошо его понимаю. Однако есть одна вещь, которая беспокоит меня при разработке надежных приложений React - какие инструменты используют разработчики для проверки статического типа?

Мне очень нравится TypeScript. Я думаю, что это значительно облегчает разработку приложений JavaScript благодаря проверке типов и другим интересным функциям. Visual Studio Code также предлагает действительно хорошее автозавершение кода. И я знаю, что могу заставить его работать с React, используя типизацию + DenifentyTyped.

Дело в том, что руководств по использованию React + TypeScript не так много. Также, похоже, не так много статей о разработке с использованием этой комбинации. С другой стороны, похоже, что многие люди используют Flow, проект, поддерживаемый Facebook (и я думаю, они также используй это).

Мне удалось найти обсуждение на Reddit с плюсами и минусами. о том, как идти по пути React + TypeScript / React + Flow. Однако мне он кажется довольно устаревшим, поскольку ему сейчас около 10 месяцев. Думаю, с тех пор многое изменилось.

Я также нашел две статьи об использовании React + Flow и React + TypeScript. Автор указывает на некоторые проблемы, с которыми он сталкивается при использовании обоих вариантов, и приходит к выводу, что TypeScript - «лучший выбор прямо сейчас» (ноябрь 2015 г.), особенно потому, что у проекта Flow много проблем и низкая активность разработчиков со стороны Facebook. Он также упоминает, что это плохо сочетается с Babel?

Итак, я предполагаю, что вопрос будет в следующем: безопасно ли использовать комбинацию React + TypeScript, или я столкнусь с некоторыми трудностями? А как насчет Flow? Есть ли другие подобные инструменты, которые мне стоит попробовать? Какой подход вы порекомендуете?

Обновление, сентябрь 2017 г .:

Имея более года опыта ежедневного использования TypeScript и некоторое время играя с Flow, я пришел к следующим выводам:

  • TypeScript по сей день болезненно использовать. Проблема в том, что мир JavaScript движется так быстро, что TypeScript продолжает отставать. Думаете об использовании этой новой причудливой функции ES7 stage 3? Нет, не можешь. Хотите получить подсказки по типу последней версии какой-нибудь библиотеки? Подожди месяц, а то и два, а может и больше ...
  • Flow прошел долгий путь, он был значительно улучшен, он может улавливать некоторые вещи, которые TS не может. Лучше всего то, что он наконец-то работает в Windows. Кроме того, есть отличный плагин для VS Code (не знаю, почему у него рейтинг 3/5). И он работает на все 100% с React Native, TypeScript еще не на 50%.
  • В большинстве случаев типы вообще не нужны. Дополнительный набор текста того не стоит. JS - это язык с динамической типизацией, избавьтесь от этого :)

TL; DR: Если вы планируете использовать какую-либо программу проверки типов, я рекомендую использовать Flow.

Обновление, февраль 2019 г .:

Я считаю, что приведенная выше рекомендация устарела и больше не актуальна. Три причины:

Итак, я думаю, что TypeScript - гораздо более прагматичный выбор, чем Flow в 2019 году.

Что касается того, стоит ли вообще использовать какую-либо проверку типов, я бы сказал, что это зависит от размера проекта. Маленьким проектам это, наверное, не нужно.


person Honza Kalfus    schedule 26.04.2016    source источник
comment
Вы также можете просто использовать простой javascript, и React предлагает вам propTypes, чтобы вы могли убедиться, что реквизиты являются правильным типом и передаются при необходимости.   -  person erichardson30    schedule 26.04.2016
comment
Да, я знаю о propTypes. Однако это решает проблему лишь частично - на уровне представления (если я не ошибаюсь?). А как насчет кода в магазинах и акциях? Я бы хотел, чтобы там была статическая типизация.   -  person Honza Kalfus    schedule 26.04.2016
comment
blog.wolksoftware.com/working-with-react-and-typescript похоже, что у него есть хорошая документация об использовании машинописного текста с реакцией и различных расширений, которые вам нужно использовать   -  person erichardson30    schedule 26.04.2016
comment
Спасибо за ссылку на статью! Я видел это в прошлом, но я думаю, что автор слишком быстро обдумывает вещи (особенно для таких, как я, которые только начали с React). Тем не менее, просматривая статью во второй раз, я обнаружил ссылку на отличную статью и настоятельно рекомендую прочитать его, если вы хотите использовать комбинацию React + TypeScript, как я.   -  person Honza Kalfus    schedule 27.04.2016
comment
Спасибо, что продолжаете обновлять это через 3 года после публикации. Стоит отметить, что ts теперь просто поддерживается с помощью $ create-react-app ‹project-name› --typescript   -  person PathToLife    schedule 10.07.2019
comment
Это действительно отличный пост Спасибо за обновление ваших первоначальных результатов.   -  person Alex    schedule 12.10.2019
comment
И спасибо за сохранение ваших первоначальных выводов в этом посте. Историческая перспектива того, что эти системы должны идти в ногу с ES в особенно турбулентной фазе в то время, является хорошей информацией, если мы полагаем, что это обоснованный выбор дизайна (например, сосредоточение внимания на легких аннотациях и более тяжелых выводах для компенсации). Конечно, любой может определить, актуально ли это сегодня или нет, и, следовательно, имеет ли смысл этот выбор дизайна или нет (если все подписи аннотированы, сопоставимы ли возможности внутреннего вывода?). FTR Я был сторонником потока и теперь пытаюсь разогреться до TS.   -  person tne    schedule 20.06.2020


Ответы (4)


Я собираюсь начать этот ответ, сказав, что я никогда не использовал Flow, поэтому я не могу сказать об этом много. Но мы используем React и TypeScript в работе, и они отлично работают.

У нас есть все преимущества, о которых, как я полагаю, вы уже знаете, такие как рефакторинг, безопасность типов, автозаполнение и т. Д.

Конечно, для того, что я видел, синтаксис Flow чище, чем TypeScript, но вы можете добавлять свои типы, используя TypeScript постепенно. Думаю, это скорее дело вкуса. Некоторые люди предпочитают, чтобы код был явно типизирован, другие предпочитают печатать меньше и иметь более сильный вывод типа.

Что касается технологий, я бы сказал, что TypeScript - беспроигрышный вариант, Microsoft продвигает язык (будет версия 2 скоро), Angular также использует его, и есть много разработчиков Angular. Даже здесь, на SO, у тега TypeScript более 4К последователей, и редко остаются вопросы без ответа.

Большая проблема TypeScript, по крайней мере для нас, заключается в том, что время от времени мы решаем использовать компонент или библиотеку, не имеющую определений типов, поэтому мы должны создавать их сами. Но я думаю, это способ внести свой вклад в сообщество.

person thitemple    schedule 26.04.2016

Я просто задал себе тот же вопрос (но не с React) и нашел следующие статьи, полезные при оценке этих двух:

Подход, применяемый проектировщиками потока, кажется более функциональным с лучшим выводом типов и лучшим подходом для нулевых значений. Тем не менее, TypeScript имеет лучшую поддержку сообщества, особенно в отношении добавления типов для сторонних библиотек через http://definentytyped.org/ что важно для того, чтобы типы проходили через весь ваш код для максимальной безопасности типов. TypeScript создан Microsoft, который имеет богатую историю написания компиляторов и развития технологий в благоприятных направлениях - примечательным здесь является C # и тот факт, что они уже добавляют ненулевые типы (2016-07-11): https://blogs.msdn.microsoft.com/typescript/2016/07/11/announcing-typescript-2-0-beta/

TypeScript кажется сегодня более безопасной ставкой.

А для тех, кто пробует TypeScript в существующей кодовой базе, я обнаружил, что следующие настройки в моем файле tsconfig.json действительно полезны, позволяя TypeScript сосуществовать с JavaScript (позволяя переходить по одному файлу за раз):

{
    "compilerOptions": {
        "allowJs": true,
        "isolatedModules": true,
        ...
    }
}
person Spritely    schedule 28.07.2016

В моей разработке на React у меня есть довольно сложный Babel / Webpack / Flow / Набор инструментов Mocha настроен и никогда не имел проблем с Flow. Требуется некоторое усилие, чтобы все настроить (сначала Webpack может показаться сложным), но потом он просто работает. Flow, безусловно, лучший вариант, так как это более узкая и сфокусированная технология, которая, скорее всего, будет хорошо работать с другими инструментами. Напротив, TypeScript пытается быть чем-то большим, чем просто инструментом вывода типов / проверки статических типов, и поэтому приносит дополнительный багаж и допущения. Итак, React - это специализированный инструмент, который хорошо справляется с одной задачей, в то время как TypeScript - это, по сути, язык, расположенный поверх JavaScript. Чтобы Microsoft добилась своего, файлы TypeScript обычно имеют другое расширение (.ts вместо .js), потому что теперь вы используете другой язык, понятно?

TypeScript использует генерацию кода для вывода JavaScript, тогда как в Flow аннотации просто удаляются, генерации кода как таковой нет. В прошлом люди из Microsoft, продвигающие TypeScript, делали заявление о том, что генерация кода выполняется «локально для файла» (я не помню точную используемую терминологию). Это должно было дать успокаивающее заверение в том, что компилятор TypeScript не делает ничего слишком волшебного. Во всяком случае, я больше не могу найти это утверждение на видном месте. С Flow вам не нужны такие гарантии, поскольку вы пишете на простом JavaScript (или в любой другой версии ECMA, для которой вы настроили Babel), а аннотации, как я уже сказал, просто удаляются.

Не говоря уже о том, что TypeScript исходит от компании, которая специализируется на неэтичных и сомнительных технических приемах (я не исключаю, что TypeScript может в конечном итоге оказаться матерью всех уловок Embrace-Extend-Extinguish). Не будем забывать, что Microsoft сделала все возможное, чтобы вызвать сбой Javascript, поскольку они (справедливо, хотя и с опозданием) предвидели, какую угрозу он представляет и продолжает представлять для их дрянной операционной системы и их раздутого офисного пакета.

Кроме того, система типов Flow была намного мощнее, когда я последний раз оценивал TypeScript (около 2015 г.), и было намного проще применять ее постепенно или даже время от времени в исходных текстах. Для интеграции сторонних библиотек я использую flowtyped, и мне очень редко нужно дополнять их нашел там с моими собственными определениями.

Наконец, тот факт, что Angular использует TypeScript, абсолютно ничего не значит, поскольку Angular не очень актуален для новых проектов. React победил, пора двигаться дальше.

person Marcus Junius Brutus    schedule 20.07.2017
comment
компания, которая специализируется на неэтичных и сомнительных технических приемах, а Facebook - нет? :П - person swalladge; 24.11.2017
comment
Сообщение сильно самоуверенное (есть веская причина, по которой вопросы «против» не по теме на SO). Что касается расширений, то .js с потоковым типом не является допустимым JS, поэтому я не уверен, что сохранение такого же расширения здесь хорошо (не говоря уже о том, что TS является заменой инструментальной цепочки Babel + Flow, а не только Flow). гораздо более мощный - заслуживает пояснения. Angular не очень актуален для новых проектов - как так? Просто потому, что вы находитесь в лодке React, не означает, что все в ней. Фреймворки действительно разные, имеют сильные и слабые стороны, набирают обороты и идут лицом к лицу с SO. - person Estus Flask; 13.04.2018

Если вам нужны проверки типов, но вы бы предпочли сохранить старый простой javascript (чтобы избежать компиляции или для переносимости и т. Д.), Вот одно важное различие между ними (для React или в целом):

  • With Flow the initial setup can run static analysis on vanilla js (it infers many types):
    function square(n) {
      return n * n; // Error!
    }
    
    square("2");
    
  • With TypeScript there's a migration effort and only some vanilla js static analysis without it:
    • noImplicitReturns which prevents you from forgetting to return at the end of a function.
    • noFallthroughCasesInSwitch что полезно, если вы никогда не хотите забывать оператор break между регистрами в блоке switch.
    • TypeScript также будет предупреждать о недоступном коде и метках, которые вы можете отключить с помощью allowUnreachableCode и allowUnusedLabels соответственно.

Больше преимуществ для Flow

Типы комментариев и Подавление ошибок продвинуть поддержку vanilla js на шаг вперед, позволяя постепенно включать проверки типов с помощью юридических комментариев js, которые аннотируют тип или подавляют определенные проверки, которые вы может быть еще не готов. Типы комментариев были запросом функции в TypeScript в течение некоторого времени и только недавно за это был пиар (см. предыдущую ссылку).

Недостатки потока

Тем не менее, вся простота Flow достигается за счет довольно сложной сложной конфигурации с некоторыми раздражающие предостережения, например, как он проверяет типы сторонних библиотек и т. д. Лучший совет кому-то могут рассказать о Flow: попробуйте сделать перекрестные ссылки на все, что вы читаете в их документации, так как она устарела и в некоторых случаях может вводить в заблуждение.

person ecoe    schedule 28.02.2021