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 игнорировать определения встроенной библиотеки.
Значение по умолчанию
.
Установив это значение, мы больше не будем получать какие-либо типы, предоставляемые потоком. Это позволяет нам использовать только те типы, которые мы указываем. Обычной практикой является переключение этого на
Другой вариант, конечно, просто открыть PR. Flow выпускается довольно быстро и надежно, а изменения в предоставляемых libdef обычно быстро объединяются.
Я воздержусь от комментариев относительно того, насколько удовлетворительным может быть или не быть такое положение дел, но если кто-то сталкивается с этими проблемами, то, надеюсь, это вся информация, которая вам нужна для формулирования решений.