できない.dev

TypeScript で「Not all code paths return a value」(TS7030) が消えない

noImplicitReturns が有効な関数で、値を返さない分岐があると出る。
全分岐で return するか、戻り値型を明示して undefined を許容する。

公開: 更新:

症状できない · exit 2
npx tsc
src/bad.ts(2,39): error TS7030: Not all code paths return a value.
解決後できた · exit 0
npx tsc

2026-09-05 に node:20(Node.js 20.20.2 / npm 10.8.2) で実際に打って取った出力。検証環境の詳細

要約

Not all code paths return a value.(TS7030)は、noImplicitReturns が有効な状態で、関数の一部の経路だけ値を返し、他の経路が何も返さずに関数を抜けるときに出る。

TypeScript は「値を返す関数なら、どの経路でも返すべき」とみなす。
抜ける経路を無くすか、戻り値型で「返さない場合がある」ことを明示すれば消える。

実行例

TypeScript 5.9.3 で試すと、値を返さない経路のある関数は src/bad.ts(2,39) のように行と桁つきで TS7030 として報告される。
全経路で値を返すよう直すと、同じ npx tsc が何も出力せずに終了する。

Version 5.9.3
$ npx tsc
src/bad.ts(2,39): error TS7030: Not all code paths return a value.
$ echo $?
2
$ npx tsc
$ echo $?
0

— 2026-09-05 時点の出力

検証環境Node.js 20.20.2 / npm 10.8.2 / Python 3.11.2 / 2026-09-05 検証(ほか 1 件)
検証日
実行環境
node:20 Debian GNU/Linux 12 (bookworm)
バージョン
  • Node.js 20.20.2
  • npm 10.8.2
  • Python 3.11.2
  • Git 2.39.5

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

解決策

1. すべての経路で返す

function grade(score: number): string {
  if (score >= 80) return "A";
  if (score >= 60) return "B";
  return "C"; // 最後の経路も必ず返す
}

else や末尾の return を足し、どの条件でも値を返すようにする。

2. 返さない経路を型で許容する

function find(id: number): string | undefined {
  if (id > 0) return "ok";
  // それ以外は undefined を返す(暗黙)
}

返さない場合があるのが正しい仕様なら、戻り値型に undefined を含めて意図を明示する。

3. forEach を map に変える

// NG: forEach のコールバックで return しても外側は返らない
// OK: 値を返す map を使う
const names = users.map((u) => u.name);

「各要素から値を作って返す」処理は map が正しい。forEach は副作用専用で、戻り値を作らない。

よくある原因

  1. 分岐の返し漏れ: if は return するが else が無く、条件を満たさないと何も返さない。
  2. noImplicitReturns: tsconfig.json で有効化している(strict セットに含まれない独立フラグ)。
  3. コールバックでの return: forEach のコールバックで return しても、外側の関数は値を返さない。

この手順で直った?