Flow не поддерживает некоторые встроенные методы JavaScript (ECMAScript), что мне делать?

Как разработчик встроенного программного обеспечения, привыкший к строго типизированным языкам, я был вынужден использовать Flow (https://flow.org) при написании экспериментальной утилиты на JavaScript.

Около 10 минут написания кода с помощью JS+Flow, Flow (двоичный файл 'flow-bin') дал мне следующую ошибку:

Невозможно вызвать string.trim().replaceAll, потому что свойство replaceAll (вы имели в виду замену?) отсутствует в String [1].

в отношении следующего кода (с аннотациями Flow):

      static sanitizeString(string : string) : string {
    return string.trim().replaceAll(/(?:\s+|\.+)/g, "");
}

Flow сообщает мне, что он не может найти (довольно широко реализованную) функцию string.prototype.replaceAll(...) в (что кажется) "символическим" файле определений: tmp/flow/flowlib_1fa18dde633e97c7_501/core.js

Что вызывает вопрос:

Находятся ли пользователи Flow исключительно во власти подготовленного файла определений, когда дело доходит до использования (широко реализованных) методов, определенных стандартами ECMAScript ( или предложений/черновиков, если на то пошло, учитывая стремительный характер реализации браузерами ECMAScript)?

Нужно ли мне изменять файл определений (core.js), чтобы решить эту проблему?

2 ответа

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

Но это довольно интересно. Это действительно выдает эту ошибку: Пример потока

Теперь все становится еще интереснее, поскольку TypeScript выдает ту же ошибку: Пример TS

Однако TS более надежен с сообщением об ошибке:

Свойство replaceAll не существует для типа «строка». Вам нужно изменить целевую библиотеку? Попробуйте изменить libпараметр компилятора «esnext» или более поздней версии.

Следовательно, я предлагаю вам последовать этому совету и переключить компилятор потока, чтобы следовать другому набору правил (в .flowconfig, я думаю?).

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

Flow предоставляет базовый набор типов в качестве хорошей отправной точки для большинства случаев использования. Они регулярно обновляются, но не являются частью методического процесса. Пользователи часто открывают PR против потока, чтобы обновить предоставленные libdef части, в которых они заинтересованы, и это, вероятно, наиболее распространенный способ, которым эти обновления происходят прямо сейчас. Изменения в основных типах обычно очень просты и являются хорошим «первым PR». Также стоит отметить, что у потока гораздо меньше входящих PR, чем у машинописного текста.

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

Один из вариантов — прекратить использование предоставленных типов. Flow имеет параметр конфигурации:

(логическое)

Flow имеет встроенные определения библиотек. Установка этого параметра в сообщит Flow игнорировать определения встроенной библиотеки.

Значение по умолчанию .

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

Другой вариант, конечно, просто открыть PR. Flow выпускается довольно быстро и надежно, а изменения в предоставляемых libdef обычно быстро объединяются.

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

Другие вопросы по тегам