TypeScript で「Not all code paths return a value」(TS7030) が消えない
noImplicitReturns が有効な関数で、値を返さない分岐があると出る。
全分岐で return するか、戻り値型を明示して undefined を許容する。
公開:
要約
Not all code paths return a value.(TS7030)は、noImplicitReturns が有効な状態で、関数の一部の経路だけ値を返し、他の経路が何も返さずに関数を抜けるときに出る。
TypeScript は「値を返す関数なら、どの経路でも返すべき」とみなす。
抜ける経路を無くすか、戻り値型で「返さない場合がある」ことを明示すれば消える。
よくある原因
- 分岐の返し漏れ:
ifは return するがelseが無く、条件を満たさないと何も返さない。 - noImplicitReturns:
tsconfig.jsonで有効化している(strictセットに含まれない独立フラグ)。 - コールバックでの 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 は副作用専用で、戻り値を作らない。