できない.dev

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

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

公開:

要約

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

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

よくある原因

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

解決策

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 は副作用専用で、戻り値を作らない。

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