Простой способ проверять typescript без skipLibCheck: true
Всем привет!
Решил начать писать короткие статьи с маленькими фичами, которые могут помочь посмотреть на решение проблем немного под другим углом.
Дано:
Мы используем Fluent UI в нашем проекте. После перехода на React 18 мы начали получать ошибки такого рода:
Подобные ошибки могут возникать по вине любой рандомной библиотеки.
Типичное решение:
Из того что я находил в интернете - в основном рекомендуют поставить skipLibCheck: true или править и патчить. Можно также просто игнорировать. Ни один из этих вариантов мне не нравится по следующим причинам:
Из за skibLibCheck иногда пропускаются ошибки с типами в самом коде. Иногда компилятор перестает подсвечивать несуществующие типы. Потом когда выключаешь - получаешь сюрприз.
Патчинг - можно пропатчить и поправить, но приходится следить за версией и когда разработчик библиотеки внесет изменения, нужно обновлять патчинг (неудобно).
Игнорирование - это работает до тех пор, пока ошибки не попадают в какую-либо автоматизацию. Например, мы используем 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;