できない.dev

tsc コマンドが見つからない(command not found: tsc)

tsccommand not found になる原因は、TypeScript をグローバルではなくプロジェクトにのみ入れているケースが大半。npx tscnpm run 経由で叩くのが正解。

公開: 更新:

要約

tsc: command not found のほとんどは「ローカル install しただけでグローバルに無い」が原因。npx tscnode_modules/.bin/tsc を直接叩くか、npm scripts で間接的に呼ぶのが定石。

よくある原因

  1. ローカルのみ install: npm install -D typescript だけだとシェルから tsc は引けない。./node_modules/.bin/tsc には存在する。
  2. PATH キャッシュ: グローバルに入れた直後、シェルが旧 PATH を覚えており再起動が必要。
  3. install 失敗: npm install がエラー終了して node_modules/.bin/tsc が無い。
  4. Windows 固有: PATHEXT.cmd 不在、または WSL シェルから Windows 側 Node を呼んでパス変換が崩れる。
  5. monorepo: TypeScript が workspace ルートだけに入っており、サブパッケージから直接呼べない。

解決策

1. npx で叩く(推奨)

npx tsc --version
npx tsc -p tsconfig.json

npx./node_modules/.bin を最優先で探すため、ローカル install で十分(npm Docs - npx(新しいタブで開く))。

2. npm scripts に書く

{
  "scripts": {
    "build": "tsc -p .",
    "typecheck": "tsc --noEmit"
  }
}

npm run build ではシェルの PATH に ./node_modules/.bin が自動で先頭追加される。

3. どうしてもグローバルに必要なら

npm install -g typescript
which tsc
tsc --version

ただし複数プロジェクトでバージョン差があると挙動が変わるので、CI とローカルで一致させる運用がベター。

4. install 失敗を確認

ls node_modules/.bin/tsc
# 存在しなければ
rm -rf node_modules package-lock.json
npm install

5. monorepo は workspace 経由で呼ぶ

# pnpm
pnpm --filter @myorg/app exec tsc --noEmit
 
# npm workspaces
npm exec --workspace=packages/app -- tsc --noEmit

実行例

実際に上記の手順を node:20(Debian GNU/Linux 12)環境で動かすと、グローバルに tsc が存在しない状態(終了コード 127)から、ローカル install 後に node_modules/.bin/tsc および npx tsc で TypeScript 5.9.3 を正常実行(終了コード 0)できることが確認できる。

$ command -v tsc
command -v tsc の終了コード: 127
$ tsc --version
sh: 1: /recipe.sh: tsc: not found
tsc 直接実行の終了コード: 127(127 = command not found)
$ tsc --version
sh: 1: /recipe.sh: tsc: not found
終了コード: 127
$ ls node_modules/.bin/tsc && ./node_modules/.bin/tsc --version
node_modules/.bin/tsc
Version 5.9.3
終了コード: 0
$ npx tsc --version
Version 5.9.3
終了コード: 0(0 = 実行できた)

— 2026-08-02 時点の出力

この記事は役立ちましたか?