Всем привет!

Решил начать писать короткие статьи с маленькими фичами, которые могут помочь посмотреть на решение проблем немного под другим углом.

Дано:

Мы используем Fluent UI в нашем проекте. После перехода на React 18 мы начали получать ошибки такого рода:

Ошибки в типах node_modules.

Подобные ошибки могут возникать по вине любой рандомной библиотеки.

Типичное решение:

Из того что я находил в интернете - в основном рекомендуют поставить skipLibCheck: true или править и патчить. Можно также просто игнорировать. Ни один из этих вариантов мне не нравится по следующим причинам:

  1. Из за skibLibCheck иногда пропускаются ошибки с типами в самом коде. Иногда компилятор перестает подсвечивать несуществующие типы. Потом когда выключаешь - получаешь сюрприз.

  2. Патчинг - можно пропатчить и поправить, но приходится следить за версией и когда разработчик библиотеки внесет изменения, нужно обновлять патчинг (неудобно).

  3. Игнорирование - это работает до тех пор, пока ошибки не попадают в какую-либо автоматизацию. Например, мы используем pre-commit и проверяем типы перед тем как пушить коммит. Если их игнорировать - то комитить больше не получится.

Мое решение:

Подумав над проблемой, я заметил следующую особенность - ошибки в самом проекте начинаются с пути src/folder/file.ts, а из модулей с папки node_modules. Тогда мне пришла в голову идея - а что если фильтровать ответ от tsc --noEmit и проверять, есть ли ошибки не из папки node_modules. Мы используем Husky - husky - npm (npmjs.com) для pre-commit.

Приложил скрипт, (буду благодарен если кто-то сможет написать его оптимальнее, я не эксперт в баше) который вызывает проверку типов, сохраняет результат в файл, читает файл и фильтрует ошибки. Если ошибки только из папки node_modules - все ок. Если есть другие, то он вернет их в консоль.

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

cd ./ClientApp
echo "Running tsc --noEmit --preatty"
#! Сохраняю результат комманды в файл
npm run typescript > output-file.txt | cat
value=`cat output-file.txt`
#! Ищу любое упоминание папки src \ если у вас другая рут папка
#! поменяйте название
result=$(grep -c src output-file.txt | cat)

if [ $result -eq 0 ]
 then
  echo "OK: NO ERRORS FOUND"
  rm output-file.txt
  exit 0;
  else
  echo "FOUND ERRORS. RUN npm run typescript to check them and FIX before commiting";
  grep src output-file.txt | cat
  rm output-file.txt
  exit 1;
fi

exit 1;