web-dev-qa-db-ja.com

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はまた、開発中にこの問題について通知するのに十分なほどスマートです。

私の目標は、そのようなエラーがバージョン管理になってしまうのを防ぐ、プリコミットgitフックを作成することです。これをtslinthusky、およびlint-stagedを使用して、このnpm scriptで実行しようとしました:

"lint": "tslint --project tsconfig.json --config tslint.json"

ただし、これはtslintで表示されるコンパイルエラーにはなりません。黙って無視されます。

次に、tslint.jsonにルールを追加しようとしました。

"typedef": [
      true,
      "arrow-parameter"
    ]

これはtslintに文句をつけましたが、tscコンパイラが文句を言わない匿名の矢印関数でも文句を言い始めました。これらの矢印関数では、型は親スコープで既に設定されているため、型を追加する必要はありません(推測されます)。

したがって、基本的には、この場合、tslintがtscと同じように動作するようにします。コンパイルが失敗する原因となるエラー(上記の矢印関数など)があるときはいつでも、実際にはJavascriptにコンパイルせずに、コミットを防止したいと思います。これは可能ですか?

14
Tom

私はあなたの最善の策は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-fileslint-stagedコマンドとして設定すると、動作するようです。 (必要に応じて、これをbash以外のプログラミング言語で書くことは、読者の練習問題として残します。)

ただし、1つのファイルを編集すると、別のファイルにエラーが発生する可能性があるため(たとえば、他のファイルが使用しているタイプを変更した場合)、プロジェクトをTypeScriptエラーからできるだけ早く取り除くことをお勧めします。必要なハッキング(後で検索できるようにマークを付ける限り)を行い、プロジェクト全体でエラーが発生しないようにフックを設定します。実際、特にnoImplicitAnyに関しては、数年前にJavaScriptプロジェクトをTypeScriptに移行したときに、暗黙のanyエラーが発生した場所に明示的なanyを挿入するスクリプトを作成し、その後、自由に明示的にanysを修正しました。興味があればスクリプトを共有できます。

7
Matt McCutchen

これをコメントとして追加する十分な評判はありませんが、次のようなエラーが発生している人は誰でも

./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
1
jmmendez