Как собирать проблемы с компиляцией Typescript?
Возьмите следующую функцию стрелки Typescript:
/**
* Returns a probably unique component name.
*
* @param baseName a suggested name to make unique.
* @returns a probably unique name.
*/
export const getUniqueComponentName = (
baseName
): string => {
return baseName + Math.round(Math.random() * 10000000)
}
Когда Typescript настроен в tsconfig.json
в качестве таких:
"noImplicitAny": true,
Это правильно приводит к ошибке компиляции:
[ts] Параметр 'baseName' неявно имеет тип 'any'.
Visual Studio Code также достаточно умен, чтобы сообщить вам об этой проблеме во время разработки.
Моя цель состоит в том, чтобы создать pre-commit git hook, который предотвращает попадание таких ошибок в управление версиями. Я пытался сделать это с tslint
, husky
а также lint-staged
используя это npm script
:
"lint": "tslint --project tsconfig.json --config tslint.json"
Однако это не приводит к ошибке компиляции, обнаруженной tslint. Это тихо игнорируется.
Затем я попытался добавить правило в tslint.json:
"typedef": [
true,
"arrow-parameter"
]
Хотя это заставило tslint жаловаться, оно также начало жаловаться в функциях анонимных стрелок, где tsc
Компилятор не жалуется. В этих функциях стрелок нет необходимости добавлять типы, потому что типы уже были установлены ранее в родительской области (они выводятся).
В общем, я бы хотел, чтобы tslint в этом случае вел себя так же, как и tsc. В любое время, когда возникает ошибка, которая может привести к сбою компиляции (например, функция стрелки выше), я хотел бы предотвратить коммит, но без фактической компиляции в Javascript. Это возможно?
2 ответа
Я думаю, что тебе лучше всего бежать tsc --noEmit -p .
и отфильтруйте выходные данные для ошибок в измененных файлах. Например, я сохранил следующий скрипт в tsc-some-files
:
#!/bin/bash
declare -A include_files
for f in "$@"; do
include_files["${f#$PWD/}"]=1
done
node_modules/.bin/tsc --noEmit -p . | (
status=0
show_continuation=false
while IFS='' read -r line; do
case "$line" in
(' '*)
if $show_continuation; then
echo "$line" >&2
fi
;;
(*)
file="${line%%(*}"
if [ -n "${include_files["$file"]}" ]; then
show_continuation=true
echo "$line" >&2
status=1
else
show_continuation=false
fi
;;
esac
done
exit $status
)
и установить ./tsc-some-files
Как мой lint-staged
команда, и это, казалось, сработало. (Запись этого на языке программирования, отличном от bash, при желании оставляется в качестве упражнения для читателя.)
Имейте в виду, что редактирование одного файла может привести к ошибке в другом файле (например, если вы изменили тип чего-то, что использует другой файл), поэтому я настоятельно рекомендую вам как можно быстрее очистить ваш проект от ошибок TypeScript. необходимы хаки (если вы пометите их, чтобы потом можно было их искать), а затем установите свой хук, чтобы не допускать ошибок во всем проекте. На самом деле, в отношении noImplicitAny
в частности, когда я несколько лет назад перенес проект JavaScript в TypeScript, я написал скрипт, который вставлял явный any
везде было неявное any
ошибка, то я исправил явное any
на моем досуге. Я могу поделиться сценарием, если вам интересно.
У меня недостаточно репутации, чтобы добавить это как комментарий, но любой, у кого появляется ошибка, похожая на
./scripts/ts-staged-files.sh: line 4:
src/ui/Components/Select/Select.tsx: division by 0
(error token is "/Components/Select/Select.tsx")
Я сделал эту небольшую модификацию ответа Мэтта Маккатчена, чтобы исправить это.
#!/bin/bash
include_files=()
for f in "$@"; do
include_files+=("${f#$PWD/}")
done