◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-07-15上級

型は付いたのに、安全にはならなかった — JS→TS 移行で Claude Code に任せた範囲と任せなかった範囲

tsc が緑でも any は静かに漏れます。型カバレッジで移行の実態を測り、Claude Code に任せて速い作業と人が決めるべき判断を線引きし、悪化を止める CI ゲートまでを実装付きで整理した運用メモです。

Claude Code265TypeScript24型カバレッジ移行10CI6個人開発130

✦ プレミアム記事

tsc --noEmit が緑になった翌週に、本番で Cannot read properties of undefined が出ました。

移行そのものは順調だったのです。JavaScript のままだったユーティリティ層をひととおり .ts に変え、strict: true も入れ、CI も通っていました。手元では「終わった」と思っていました。

落ちた場所を追うと、外部 API のレスポンスを受け取る関数でした。型はちゃんと付いています。ただしその型は、私が書いたのでも Claude Code が推論したのでもなく、as ApiResponse と手で押し込んだ嘘でした。

型が付いていることと、安全であることは別でした。個人開発で四つのサイトを回している身としては、痛いところを突かれた気分でした。

tsc が緑でも安全にならない、四つの漏れ道

移行後のコードベースを調べ直して分かったのは、any は「消した」つもりでも別の姿で残るということでした。私の場合、漏れ道は四つに整理できました。

漏れ道tsc は通るか実際に起きたこと
as による断定通る外部レスポンスを as ApiResponse で押し込み、欠けたフィールドが undefined のまま流れた
型定義のない依存パッケージ通る(noImplicitAny でも import 経由なら素通り)@types がない小さなライブラリの戻り値が実質 any で、そのまま伝播した
ジェネリクスの既定値通るuseState() や自作関数の型引数を省略し、推論が広がった
catch 節の値通るunknown のまま扱わず error.message に触れる分岐が残った

いずれも「エラーが出ないから気付けない」という共通点があります。移行の進捗を「変換したファイル数」で見ているかぎり、この四つは最後まで見えません。

進捗の指標を、ファイル数から型カバレッジに変える

そこで指標を入れ替えました。式レベルで型が付いている割合、いわゆる型カバレッジです。type-coverage を使えば一行で出ます。

npx type-coverage --detail --strict
# 12043 / 12876 94.53%
# src/lib/api-client.ts:42:15 - res
# src/lib/api-client.ts:58:9 - payload

--detail を付けると、any のまま残っている式が行番号付きで並びます。これが移行の実態でした。ファイル単位では 100% 変換済みなのに、式単位では 94.5% だったのです。残りの 5.5%、約 830 箇所が、先ほどの四つの漏れ道に分布していました。

数値そのものより、内訳が読めることに価値があります。漏れをファイル別に束ねると、手を入れる順番が決まります。

#!/usr/bin/env bash
# scripts/type-coverage-report.sh — any 残存をファイル別に集計する
set -euo pipefail
 
npx type-coverage --detail --strict 2>/dev/null \
  | grep -E '^[^ ]+\.tsx?:[0-9]+:[0-9]+' \
  | cut -d: -f1 \
  | sort | uniq -c | sort -rn \
  | head -20

私の場合、上位 5 ファイルに漏れの 6 割が集まっていました。全体を薄く直すより、この 5 ファイルの境界設計をやり直すほうが確実に速い、という判断がここで立ちます。移行は面ではなく、点から崩れていました。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦type-coverage で式単位の型付与率を測り、ファイル数 100% 裏の 94.5% を可視化する集計スクリプト
✦Claude Code に任せて速い三つの作業と、as を嘘に変えないため人が決める四つの判断の線引き表
✦型カバレッジ 94.5%→99.2% を守ったラチェット式 CI ゲート(GitHub Actions・baseline 更新の記録法)
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ Claude Code2026-10-12
SPM に移したら、起動した瞬間にアプリが落ちるようになりました — dyld の一行を Claude Code と読み解いた記録
CocoaPods から Swift Package Manager へ移した直後、ビルドは通るのに起動した瞬間に落ちました。dyld の一行から原因を切り分け、直し方と確認コマンドまでをまとめます。
⟐ Claude Code2026-09-20
Pro を払っているのに Console に請求が立っていたとき、私が最初に見た一行
サブスクリプションと API の従量は別会計で、Claude Code はそのどちらでも動きます。どちらが選ばれているかを決めるのは優先順位で、ログインはその最下段です。status の読み方と、無人実行だけが別の答えを返す理由を書き残します。
⟐ Claude Code2026-09-11
inferenceGatewayHeaders はいまも動きます。10月7日の正午に、既定値へ落ちます
9月10日から出始めた管理設定の非推奨警告を、私は表記ゆれの整理だと受け取っていました。期限を過ぎた旧名は無視されるのではなく、fail-closed な値か既定値に落ちます。旧新の対応と、設定を1本のスクリプトで棚卸しする手順を書き残します。