次の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はまた、開発中にこの問題について通知するのに十分なほどスマートです。
私の目標は、そのようなエラーがバージョン管理になってしまうのを防ぐ、プリコミットgitフックを作成することです。これを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にコンパイルせずに、コミットを防止したいと思います。これは可能ですか?
私はあなたの最善の策は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以外のプログラミング言語で書くことは、読者の練習問題として残します。)
ただし、1つのファイルを編集すると、別のファイルにエラーが発生する可能性があるため(たとえば、他のファイルが使用しているタイプを変更した場合)、プロジェクトをTypeScriptエラーからできるだけ早く取り除くことをお勧めします。必要なハッキング(後で検索できるようにマークを付ける限り)を行い、プロジェクト全体でエラーが発生しないようにフックを設定します。実際、特にnoImplicitAny
に関しては、数年前にJavaScriptプロジェクトをTypeScriptに移行したときに、暗黙のany
エラーが発生した場所に明示的なany
を挿入するスクリプトを作成し、その後、自由に明示的にany
sを修正しました。興味があればスクリプトを共有できます。
これをコメントとして追加する十分な評判はありませんが、次のようなエラーが発生している人は誰でも
./scripts/ts-staged-files.sh: line 4:
src/ui/Components/Select/Select.tsx: division by 0
(error token is "/Components/Select/Select.tsx")
それを修正するために、Matt McCutchenの回答にこの小さな変更を加えました。
#!/bin/bash
include_files=()
for f in "$@"; do
include_files+=("${f#$PWD/}")
done