スポンサーリンク

TypeScriptのコードが読みやすくなる!ChatGPTでできるリファクタ術

スポンサーリンク
この記事は約18分で読めます。
スポンサーリンク

TypeScriptで書いているのに、気づけばコードがごちゃごちゃ…。
こんなこと、ありませんか?

  • 関数が長すぎて、どこから読めばいいかわからない
  • any だらけで「これ本当に安全?」と不安になる
  • 同じような処理があちこちにある
  • ChatGPTに聞きたいけど、どう頼めばいいかわからない

「ちゃんと直したい気持ちはある。でも、どこから手をつければいいのか分からない。」
これ、かなり多くの人がハマるポイントです。

この記事では、

  • リファクタ前→後の具体例
  • 迷わない5ステップのチェックリスト
  • ChatGPTにうまく直してもらうプロンプト例

をまとめて紹介します。

筆者
筆者

読み終わるころには、
「よし、まずここを直してみよう」と1つ行動できる状態になります。

コードは才能ではなく、整え方です。
今日から一緒に、読みやすくて安心できるTypeScriptにしていきましょう。

  1. なぜTypeScriptのコードは読みにくくなるの?
    1. 「長い」「同じ」「any」が増える3つの理由
    2. 直さないと何が困る?(バグ・レビュー・改修コスト)
  2. まずはここから!リファクタリング5ステップ(チェックリスト)
    1. ✅ ステップ1:目標を決める(読みやすさ/安全/重複削除)
    2. ✅ ステップ2:怪しい場所を見つける(臭いのサイン)
    3. ✅ ステップ3:小さく直す(1回で全部やらない)
    4. ✅ ステップ4:型を強くする(any卒業)
    5. ✅ ステップ5:動くことを確認する(テスト/ログ)
  3. 🔑 大事なのは「一度に全部やらない」
  4. 例でわかる:リファクタ前→後(TypeScript)
    1. 例1:anyをやめて型を作る(入力/戻り値)
    2. 例2:同じ処理を関数にまとめる(重複削除)
    3. 例3:長い関数を小さく分ける(責任を1つに)
    4. 例4:条件分岐のごちゃごちゃを整理する(早めに返す)
    5. 🎯 何を基準に「良い」と言えるの?
  5. ChatGPTにうまく直してもらう質問のしかた(プロンプト集)
    1. まず渡す情報(目的・制約・入出力・例)
    2. コピペで使える基本プロンプト10個
    3. 失敗しがちな頼み方と直し方(追加質問の型)
    4. ちょい補足:ChatGPT(無料/有料)についての触れ方
  6. ChatGPTを「レビュー担当」にする手順(チーム開発向け)
    1. PR前セルフレビュー手順(差分→指摘→修正)
    2. 「指摘の質」を上げる指示(観点リスト)
    3. ルール化のコツ(チームで同じ基準に)
    4. 補足:レビュー支援カテゴリ(ざっくり)
  7. 便利ツールでラクする(自動整形・静的チェック・テスト)
    1. 自動整形:Prettier
    2. ルールチェック:ESLint(TypeScript対応)
    3. 型の力を引き出す:tsconfigの考え方
    4. テスト:最低限ここだけ(回帰を防ぐ)
    5. 🎯 まとめると
  8. まとめ:今日からできる最短ルート
    1. ✅ 今日やる3ステップ
  9. 🎯 大事なのは「小さく続ける」
  10. よくある質問
スポンサーリンク

なぜTypeScriptのコードは読みにくくなるの?

TypeScriptで書いているのに、「なんか読みにくい…」となること、ありますよね。
実はこれ、だいたい原因は決まっています。

「長い」「同じ」「any」が増える3つの理由

読みにくさの正体は、ほぼこの3つです。

関数が長い

1つの関数の中に、あれもこれも詰め込みすぎていませんか?
まるでランドセルに教科書もおもちゃも全部入れている状態です。
探すのが大変になります。

同じ処理があちこちにある

コピペで増えていったコード。
最初はラクですが、あとで1か所直すと「他も直さないと…」と地獄になります。

any が増えていく

とりあえず any にして動かす。
これは応急処置です。
型がゆるいと、間違いに気づけません。


直さないと何が困る?(バグ・レビュー・改修コスト)

「まあ動いているからいいか」と思いがちですが、放置するとこんなことが起きます。

  • どこを触ればいいかわからず、修正が怖くなる
  • ちょっとした変更でバグが出る
  • コードレビューで「ここ直してください」と止まる
  • 仕様変更のたびに時間がかかる

部屋が散らかっていると、物を探すだけで時間がかかりますよね。
コードも同じです。

筆者
筆者

まずは「読みにくいサイン」に気づくこと。
それだけで、直す場所の当たりがつけられるようになります。

次は、「じゃあどこから直せばいいの?」に答えていきます。

まずはここから!リファクタリング5ステップ(チェックリスト)

「直したいけど、どこからやるの?」
ここで迷うと止まりますよね。なので、順番を固定しましょう。

まずはこの5ステップです👇


✅ ステップ1:目標を決める(読みやすさ/安全/重複削除)

いきなり直し始めないでください。
「今日は何を良くするのか」を決めます。

  • OK例:anyを減らす と決める
  • NG例:なんとなく全部きれいにする

テーマは1つで十分です。


✅ ステップ2:怪しい場所を見つける(臭いのサイン)

次に、「どこが変か」を探します。

こんなサインはありませんか?

  • 1つの関数がやたら長い
  • 同じコードが3回以上出てくる
  • any や型なしの値が多い
  • OK例:まず1つの長い関数だけ見る
  • NG例:プロジェクト全体を一気に直そうとする

全部見ないで大丈夫です。1か所でOKです。


✅ ステップ3:小さく直す(1回で全部やらない)

リファクタは「ちょっとずつ」が基本です。

  • OK例:関数を1つだけ分ける
  • NG例:100行まとめて書き直す

一度に大きく変えると、どこで壊れたかわからなくなります。
小さく、安全にです。


✅ ステップ4:型を強くする(any卒業)

TypeScriptの強みは「型」です。

いきなり完璧にしなくて大丈夫です。

  • まず anyunknown にする
  • 使う前にチェックを書く
  • ちゃんとした型を作る
  • OK例:入力と戻り値だけ型をつける
  • NG例:型が面倒だから全部 any のまま

ここが一番「将来ラクになる」ポイントです。


✅ ステップ5:動くことを確認する(テスト/ログ)

直したら、必ず確認します。

  • OK例:実行して同じ結果になるか見る
  • OK例:ログや簡単なテストを書く
  • NG例:見た目きれいだからOKにする

「きれい」と「正しい」は別です。


🔑 大事なのは「一度に全部やらない」

リファクタは掃除と同じです。

今日は机だけ。
明日は本棚だけ。

少しずつ整えるほうが、結果的に早いです。

筆者
筆者

次は、実際に「どう直すの?」を
前→後の具体例で見ていきましょう。

例でわかる:リファクタ前→後(TypeScript)

ここがいちばん大事なパートです。
「どう直すのか」を、前→後で見ていきましょう。

毎回この順番でいきます👇

  • 困りごと
  • 直し方
  • 何が良くなったか

例1:anyをやめて型を作る(入力/戻り値)

❌ リファクタ前

function formatUser(user: any) {
  return user.name + " (" + user.age + ")";
}

😓 困りごと

  • user が何なのかわからない
  • age が文字でも通ってしまう
  • 間違っても気づけない

✅ リファクタ後

type User = {
  name: string;
  age: number;
};

function formatUser(user: User): string {
  return `${user.name} (${user.age})`;
}

👍 良くなった点

  • 入力がはっきりした
  • 戻り値も明確
  • 間違えるとエラーで教えてくれる
💡ポイント

いきなり完璧な型が作れないときは、

  • anyunknown
  • 中でチェック
  • 最後に型を作る

という段階でもOKです。


例2:同じ処理を関数にまとめる(重複削除)

❌ リファクタ前

const total1 = price1 * 1.1;
const total2 = price2 * 1.1;
const total3 = price3 * 1.1;

😓 困りごと

  • 税率を変えると全部直す
  • コピペが増えていく

✅ リファクタ後

function addTax(price: number): number {
  return price * 1.1;
}

const total1 = addTax(price1);
const total2 = addTax(price2);
const total3 = addTax(price3);

👍 良くなった点

  • 税率を1か所だけ直せばいい
  • 「何をしているか」が名前でわかる
  • コードが短くなる

基準はシンプルです。
同じ形が3回出たら、まとめられないか考える。


例3:長い関数を小さく分ける(責任を1つに)

❌ リファクタ前

function handleOrder(order: any) {
  // バリデーション
  if (!order.user) throw new Error("no user");

  // 合計計算
  let total = 0;
  for (const item of order.items) {
    total += item.price;
  }

  // メール送信
  sendEmail(order.user.email, total);
}

😓 困りごと

  • 何の関数なのか一目でわからない
  • 修正するとき怖い
  • テストしづらい

✅ リファクタ後

function validateOrder(order: Order) { ... }

function calculateTotal(order: Order): number { ... }

function notifyUser(email: string, total: number) { ... }

function handleOrder(order: Order) {
  validateOrder(order);
  const total = calculateTotal(order);
  notifyUser(order.user.email, total);
}

👍 良くなった点

  • 役割が分かれた
  • テストしやすい
  • 読むと流れがすぐわかる

🧩 イメージは「箱に分ける」です。

  • 入力
  • 計算
  • 出力

1つの箱に1つの役目。
これだけで一気に読みやすくなります。


例4:条件分岐のごちゃごちゃを整理する(早めに返す)

❌ リファクタ前

function getDiscount(user: User) {
  let discount = 0;
  if (user) {
    if (user.isPremium) {
      discount = 20;
    } else {
      discount = 5;
    }
  }
  return discount;
}

😓 困りごと

  • ネストが深い
  • 目が疲れる
  • 条件が増えるともっと地獄

✅ リファクタ後(早めに返す)

function getDiscount(user: User): number {
  if (!user) return 0;
  if (user.isPremium) return 20;
  return 5;
}

👍 良くなった点

  • インデントが浅い
  • 上から順に読める
  • 条件追加もラク
💡コツ

「ダメなケースを先に返す」と、スッキリします。


🎯 何を基準に「良い」と言えるの?

次の3つがクリアできていればOKです。

  • 名前だけで役割がわかる
  • 変更するとき1か所で済む
  • 型が間違いを教えてくれる

これがそろうと、読むのがラク=直すのもラク になります。

筆者
筆者

次は、これをChatGPTにうまくやってもらう方法を紹介します。

ChatGPTにうまく直してもらう質問のしかた(プロンプト集)

ChatGPTって便利なんですが、聞き方がふわっとしてると、返事もふわっとします。
逆に、必要な情報をちゃんと渡すと「お、仕事できるやん」ってレベルで直してくれます。


まず渡す情報(目的・制約・入出力・例)

まずはこのテンプレでOKです。コピペして埋めるだけで精度が上がります。

  • 目的:何を良くしたい?(読みやすく/型安全に/重複削除 など)
  • 制約:変えちゃダメなこと(挙動維持/外部API変更禁止/ライブラリ追加NG など)
  • 入出力:何を受け取って、何を返す?
  • :入力例→期待する出力例(あると強い)
  • 今困ってる点any が多い、関数が長い、ネストが深い…など

✅ 小ワザ:「差分だけ出して」 って言うと読みやすいです。
✅ もう一つ:「テスト観点も出して」 って言うと安全になります。


コピペで使える基本プロンプト10個

目的別に置いておきます。必要なのをそのまま使ってください。

  1. anyをなくしたい(型を作って)
次のTypeScriptコードの any を減らして、適切な型(type/interface)を定義してください。
挙動は変えず、入力と戻り値の型は必ず明示してください。
修正後コードと、変更点の理由を箇条書きでください。
  1. いきなり型が難しいので段階的に(any→unknown→型)
any をいきなり厳密型にできないので、まず unknown に置き換え、
必要な型チェック(typeof や in など)を追加して安全にしてください。
最後に作れそうなら型定義案も出してください。挙動は維持してください。
  1. 重複を消したい(共通関数化)
次のコード内の重複処理を探して、関数にまとめてください。
呼び出し側は読みやすい名前にして、同じ挙動のまま短くしてください。
  1. 長い関数を分割したい(責任を1つに)
次の関数が長いので、役割ごとに小さな関数へ分割してください。
各関数の責任が1つになるようにし、命名も改善してください。
最後に「分割した理由」を箇条書きで説明してください。
  1. 条件分岐のネストを減らしたい(早めにreturn)
次の条件分岐を、ネストが浅くなるように整理してください(早めに return など)。
読みやすさ優先で、挙動は変えないでください。
  1. 命名を直したい(意味が通る名前へ)
次のコードの変数名・関数名が分かりにくいので、
意味が伝わる命名にリネームしてください。処理内容は変えないでください。
変更した名前の対応表も出してください。
  1. 例外処理を整えたい(境界チェック)
次のコードのエラー処理を見直して、安全な境界チェックを追加してください。
throw する場面と、戻り値で扱う場面を整理して提案してください。
  1. 型を強くしたい(戻り値をunionで安全に)
次の処理は失敗しうるので、戻り値を union 型(成功/失敗)で表現する案をください。
例:{ ok: true, value: ... } | { ok: false, error: ... }
既存の呼び出し側の修正も含めて提案してください。
  1. テスト観点も欲しい(壊してない確認)
次のコードをリファクタしたいです。挙動は変えません。
リファクタ案に加えて、最低限のテスト観点(ケース)を箇条書きで提案してください。
  1. PRレビューみたいに指摘してほしい
次の差分(またはコード)をレビューしてください。
指摘は「重要度(高/中/低)」を付け、理由と具体的な修正案もください。
観点:型安全、責任分離、重複、命名、例外、境界、可読性。

失敗しがちな頼み方と直し方(追加質問の型)

よくある失敗はこれです👇

❌「このコードきれいにして」
→ 何をどうしたいかが不明で、提案がブレます。

そこで、追加質問はこの型にすると強いです。

追加質問の型(コピペ用)

今の提案で、挙動が変わりそうな点はありますか?
変わる可能性があるなら、変えない案に修正してください。

もっと短くしたいとき

可読性を落とさず、もう少し短くできますか?
「やりすぎ」になりそうな部分は注意点も添えてください。

型が怖いとき(安全側に倒す)

型は安全側に倒したいです。strict を前提にしても壊れないように、
不確かな値は unknown からチェックして扱う形にしてください。

レビューで通したいとき

チームレビューで指摘されやすい点を先回りで潰したいです。
命名・責任分離・境界チェックの観点で、修正案を優先順位付きでください。

ちょい補足:ChatGPT(無料/有料)についての触れ方

ここは断定しすぎず、この記事ではこのくらいの温度感でOKです。

  • 無料でも十分使える
  • ただ、長いコードや丁寧なやり取りは月額課金のほうがラクなことも多い
  • まずは無料で「プロンプトの型」を試すのが最短

筆者
筆者

次は、ChatGPTを「レビュー担当」として使う手順にいきます。
チーム開発だとここがめちゃ効きます。

ChatGPTを「レビュー担当」にする手順(チーム開発向け)

チーム開発でよくあるのがこれです。

  • 「ここ、もう少し分けられませんか?」
  • 「型ゆるくないですか?」
  • 「同じ処理ありますよね?」

レビューで止まると、地味にダメージ大きいですよね。
そこでおすすめなのが、PR前にChatGPTに一度見てもらうことです。


PR前セルフレビュー手順(差分→指摘→修正)

流れはこれだけです👇

  • 差分を用意する(変更部分だけ)
  • 目的を伝える(挙動は変えない)
  • 観点を指定する(後述)
  • 指摘をもらう
  • 修正して、もう一度確認

コピペ例:

次の差分をレビューしてください。
挙動は変えていません。
観点:型安全、責任分離、重複、命名、例外処理、境界チェック。
重要度(高/中/低)付きで指摘と修正案をください。

これだけで、かなり精度が上がります。


「指摘の質」を上げる指示(観点リスト)

ただ「レビューして」だと弱いです。
観点を固定すると、安定します。

おすすめ観点はこの7つです。

  • 命名は意味が通るか
  • 1つの関数に役割が詰め込みすぎていないか
  • any や曖昧な型がないか
  • 同じ処理が増えていないか
  • エラー処理が雑ではないか
  • 境界(null/undefined/外部入力)を守れているか
  • コメントに頼りすぎていないか

特に境界チェックは見落としやすいです。
外から入る値は疑う、これ大事です。


ルール化のコツ(チームで同じ基準に)

チームで使うなら、「これだけは守る」を3つに絞ります。

  • any は原則禁止(どうしても必要なら理由を書く)
  • 1関数1責任
  • 重複は3回出たら共通化検討

これをREADMEやWikiに書いておくだけでも、
レビューのブレが減ります。


補足:レビュー支援カテゴリ(ざっくり)

より強くしたい場合は、

  • 静的解析ツール(Sonar系など)
  • CIでの自動Lint/Testチェック

と組み合わせるのがおすすめです。

多くは無料枠から始められます。いきなり有料にしなくて大丈夫です。


人ががんばる部分と、機械に任せる部分を分ける。
それだけで、チームのコード品質は一段上がります。

筆者
筆者

次は、機械に任せられる便利ツールを紹介します。

便利ツールでラクする(自動整形・静的チェック・テスト)

リファクタって、全部を人の気合いでやると疲れます。
なので、機械に任せられるところは任せましょう。

役割はこの3つです。

  • 整形=見た目をそろえる
  • ルールチェック=ダメな書き方を止める
  • テスト=壊れていないか確認する

順番にいきます。


自動整形:Prettier

まずは Prettier です。

これは「見た目」を自動でそろえてくれるツールです。

  • インデントを統一
  • セミコロンの有無を統一
  • カッコの位置を統一

地味ですが、効果は大きいです。

人によって書き方が違うと、
レビューで「そこじゃない」議論が増えます。

Prettierを入れると、

  • 書き方のケンカが消える
  • 差分が読みやすくなる

基本は無料で使えます。
まずはこれだけでも入れておくと、かなり平和になります。


ルールチェック:ESLint(TypeScript対応)

次は ESLint です。

これは「ルール違反を止める」係です。

例えば:

  • 未使用の変数
  • 危ない書き方
  • any の乱用

TypeScriptと組み合わせることで、
型まわりもチェックできます。

ポイント

人が気づく前に、機械が怒ってくれる

レビュー前にエラーが出るので、
手戻りが減ります。

これも基本は無料で始められます。


型の力を引き出す:tsconfigの考え方

TypeScriptは、設定しだいで「やさしくも、きびしくも」なります。

おすすめは、

  • できるだけ安全寄り
  • でも一気に全部strictにしない

まずは新しいファイルから厳しくする、など段階的にいきましょう。

「怖いからゆるくする」より、「少しずつ強くする」が正解です。


テスト:最低限ここだけ(回帰を防ぐ)

最後はテストです。

たとえば Vitest
Jest があります。

全部を完璧に書く必要はありません。

最低限これだけでもOKです。

  • 計算ロジック
  • 条件分岐が多いところ
  • バグを直した箇所
ポイント

「前と同じ結果になる」ことを確認する

これがあると、安心してリファクタできます。


🎯 まとめると

  • Prettier=見た目をそろえる
  • ESLint=危ない書き方を止める
  • テスト=壊れてない確認

全部、基本は無料で始められます。

人ががんばるのは「設計」。
細かいチェックは機械に任せる。

これだけで、コードの安心感が一気に上がります。

筆者
筆者

次は、よくある不安をサクッと解消していきます。

まとめ:今日からできる最短ルート

ここまで読んでくださったなら、もう準備OKです。

やることは、たった3つだけです。


✅ 今日やる3ステップ

  • チェックリストを見る
    • まずは「長い・同じ・any」のどれか1つを選びます。
  • 例のどれか1つをマネする
    • any を型にする
    • 同じ処理を関数にまとめる
    • 長い関数を分ける

      完璧じゃなくていいです。1か所で十分です。
  • ChatGPTにレビューしてもらう
    • 「挙動は変えていません。危ない点ありますか?」
      これを聞くだけで安心感が変わります。

🎯 大事なのは「小さく続ける」

リファクタは、一発で終わるイベントではありません。

  • 今日は1関数
  • 明日は1つの any
  • 来週は重複を1か所

これだけで、数週間後には別物になります。

コードは才能ではありません。
整え方を知っているかどうかです。

まずは今日、1つ直してみてください。そこから全部、変わり始めます。

よくある質問

Q
リファクタって、いつやるのが正解ですか?
A

結論:機能追加やバグ修正の“ついで”がベストです。

理由はシンプルで、その部分をすでに触るからです。
別のタイミングでやろうとすると、後回しになります。

👉 まずやること:
修正する関数だけ、ついでに1つ整えてください。

Q
コードが大きすぎて、どこから手をつければいいかわかりません…
A

結論:一番短くできそうな場所からです。

いきなりラスボス級の巨大ファイルに挑むと挫折します。

👉 まずやること:

  • 30〜50行くらいの関数を探す
  • any が1つだけある場所を直す

「勝てる戦い」から始めるのがコツです。

Q
型を厳しくしたらエラーが大量に出ました。どうすれば?
A

結論:一気にやらないでください。

エラーが100個出ると心が折れます。

👉 まずやること:

  • strict は段階的に
  • anyunknown に置き換える
  • 新規ファイルから厳しくする

“全部直す”ではなく、“増やさない”が最初の目標です。

Q
ChatGPTの提案が毎回ちょっと違います。どれを信じれば?
A

結論:一番シンプルで説明が明確な案です。

リファクタは「正解1つ」ではありません。
でも、説明できない変更は危険です。

👉 まずやること:
「なぜこの変更が良いのかを箇条書きで説明して」と追加で聞いてください。
理由が弱い案は採用しなくてOKです。

Q
リファクタで逆にバグを出すのが怖いです…
A

結論:だから小さくやるんです。

100行書き直すから怖いんです。
5行なら怖くありません。

👉 まずやること:

  • 1関数だけ直す
  • 実行してログ確認
  • 可能なら簡単なテストを書く

「きれいにする」と「壊さない」はセットです。

タイトルとURLをコピーしました