Облачные функции Firebase поддерживают несколько языков и сред выполнения, включая Javascript и Typescript. Недавно я выполнил миграцию с JavaScript на Typescript и следовал рекомендуемым шагам миграции.

Почему машинопись?

Понимая JavaScript, TypeScript экономит ваше время на обнаружение ошибок и предоставление исправлений перед запуском кода.

https://www.typescriptlang.org/

Облачные функции Firebase, написанные на Javascript, не позволяют определять аннотации типов, например возвращаемые типы.

Это был облом для меня. Код Typescript для облачных функций Firebase позволяет определять типы возвращаемых данных, поэтому я начал миграцию на TypeScript.

Командные подсказки CLI

функции инициализации firebase — это основная команда интерфейса командной строки для преобразования такой кодовой базы Javascript в Typescript. Помимо задокументированных подсказок, у меня возникли следующие дополнительные вопросы:

Не начинать с нуля с настройкой (es)lint — это просто здорово.

Импорт Firebase и параметры Typescript

Существующий импорт javascript не соответствовал соглашениям машинописного текста. Я изменил несколько операторов импорта, подобных этому:

Также я обогатил созданный firebase файл tsconfig.json на основе https://stackoverflow.com/a/63434005:

Опция esModuleInterop была очень полезна при таких проблемах с импортом:

Среда выполнения Node.js

Облачные функции поддерживают на момент написания 3 среды выполнения node.js:

https://firebase.google.com/docs/functions/manage-functions#set_nodejs_version

NVM — это удобный инструмент командной строки для переключения между различными средами выполнения узлов. Это инструмент командной строки, который может помочь подобрать одну из поддерживаемых сред выполнения. Просто вызовите nvm use [node], чтобы переключить версию узла по вашему выбору.

Линтинг

Я трачу больше всего времени на исправление ошибок eslint, чтобы иметь возможность развернуть. Так я понял, насколько расслабленным может быть код JavaScript.

Код javascript в каталоге functions/lib пока не затрагивался при попытке переноса. Тем не менее, я получил несколько выводов линтера об этом коде. Я удалил все файлы javascript в этом каталоге. Эти файлы будут созданы во время развертывания в любом случае.

Несколько функций в итоге вернули коды состояния http. Typescript помог мне убедиться, что выделенные коды состояния http возвращаются для всех условий.

Триггеры Cloud Firestore позволяют коду функций реагировать на изменения документа firestore. Параметры функций для этих функций включают change и context. Если context не используется в теле функции, eslint предупреждает о no-unused-vars. Я удалил параметр контекста для всех функций.

Я решил не исправлять некоторые ошибки eslinter, а просто игнорировать их. Я наткнулся на строки кода javascript, которые вызвали несколько ошибок eslinter. https://stackoverflow.com/a/56714489 список опций, как отключить множественные ошибки линтера:

И последнее, но не менее важное: мне пришлось столкнуться с рядом проблем с эслинтингом, которые могут возникнуть не только при миграции с javascript на typescript, но и при изменении правил линтера.

Типы параметров функции

База кода javascript, с которой я работал, не определяла типы параметров функций. Функция VS Code Вывести все типы из использования устранила эту проблему в большинстве случаев. Вывод типов помогает сэкономить время.

Сравнение строк с безопасным временем

Проверка заголовков HTTP была выполнена с помощью tsscmp на основе github.com/suryagh/tsscmp. Соответствующий машинописный код выглядит существенно иначе и вдохновлен github.com/IBM/diem/…/verifysignature.ts.

Первоначально опубликовано на https://www.lotharschulz.info.