メインコンテンツまでスキップ

第12章:Deprecation(非推奨)を上手に出す🚧📣

Deprecation Warning

この章のゴール🎯✨

  • 「非推奨=利用者に優しい“卒業予告”」だと理解する🤝🌸
  • 告知→移行案内→期限→削除の流れを、迷わず組み立てられるようになる🪜⏳
  • TypeScriptで @deprecated を付けて、VS Code上で気づける形にできる🟦👀
  • チームやCIで「非推奨の使い続け」を検知して止められる✅🧪

12.1 Deprecationってなに?🤔💭

Deprecation(非推奨)は、ざっくり言うと…

  • 今すぐ壊す(破壊的変更)じゃない🙅‍♀️💥
  • でも 将来は消す予定だから、
  • 今のうちに“こっちに移ってね”を案内する📣➡️✨

つまり「契約(Contract)」の観点だと、 **“利用者との約束を、壊さずに更新するための儀式”**なんだよね🧾🌸


12.2 非推奨の王道フロー:4ステップ🪜⏳

非推奨は「付けて終わり」じゃなくて、運用の流れが大事〜!😊🧡

  1. **告知(知らせる)**📣
  2. **移行案内(代替手段を用意する)**🗺️✨
  3. **期限(いつまでに移ってね)**📅
  4. **削除(きれいに卒業)**🧹🎓

npmパッケージの場合、npmレジストリ側でも「このバージョン非推奨だよ」ってインストール時にメッセージを出せるよ📦⚠️ (npm ドキュメント)


12.3 非推奨にする“よくある理由”あるある🧠✨

  • もっと良いAPIを作った(設計を改善した)🛠️🌟
  • セキュリティや事故の温床だった(危険だから卒業)🧯⚠️
  • 名前が分かりにくい/意味がズレた(誤解される)😵‍💫🌀
  • 仕様や外部都合で維持が難しい(依存先が変わった等)🔁📦

12.4 “良い非推奨メッセージ”のテンプレ🍰📝

非推奨コメントは、読む人が行動できるのが正解だよ🧡

✅ だいたいこの3点セットでOK👇

  • 何が非推奨?(この関数/プロパティだよ)
  • 代わりは何?(これ使ってね)
  • いつ消える?(目安でいいから期限)

例(文章の型)👇

  • oldX は非推奨です。代わりに newX を使ってください。v3.0.0 で削除予定です。」📣✨

12.5 TypeScriptで非推奨を出す:@deprecated を付けよう🟦🚧

TypeScriptは JSDocの @deprecated を理解して、VS Codeなどで警告表示してくれるよ👀✨ (TypeScript)

12.5.1 関数を非推奨にする🧩

/**
* 旧API:次のメジャーで削除予定
* @deprecated 代わりに `formatPrice()` を使ってね。v3.0.0 で削除予定。
*/
export function formatMoney(amount: number): string {
return `${amount}`;
}

export function formatPrice(amount: number): string {
return `${amount.toLocaleString("ja-JP")}`;
}

12.5.2 メソッドを非推奨にする🧸

export class UserService {
/**
* @deprecated 代わりに `getUserById()` を使ってね。v2.5.0 で削除予定。
*/
getUser(id: string) {
return this.getUserById(id);
}

getUserById(id: string) {
return { id, name: "Sakura" };
}
}

12.5.3 プロパティを非推奨にする(データ契約っぽいやつ)🧾

export interface AccountInfo {
name: string;

/** @deprecated 代わりに `gender` を使ってね。v3.0.0 で削除予定。 */
sex?: "male" | "female";

gender?: "male" | "female" | "other";
}

TypeScriptは @deprecated を理解するけど、実行を止めたりはしない(=“気づけるようにする”が役目)だよ🙂✨ (TypeScript)

ちなみに、打ち消し線が付く/付かないなど表示はケースによって差が出ることがあるので、「表示されてるか」だけに頼らないのが安全だよ🧯 (GitHub)


12.6 “実行時”にも気づかせたい時(ライブラリ向け)🔔🖥️

型やエディタ警告は便利だけど、利用者がJSで使ってたり、警告を見てなかったりもするよね😵‍💫 そういうときは「実行時に1回だけ警告」もアリ!

Node.jsにはデプリケーションの仕組み(警告の出し方、フラグで例外化など)があるよ🟩⚠️ (Node.js)

例(やりすぎ注意!)👇

let warned = false;

/**
* @deprecated 代わりに `newApi()` を使ってね。v3.0.0 で削除予定。
*/
export function oldApi() {
if (!warned) {
warned = true;
// 本番で大量に出ると辛いので、出し方はチームで相談してね🙂
console.warn("[DEPRECATED] oldApi() -> use newApi(). Will be removed in v3.0.0");
}
}

12.7 npmパッケージの非推奨:レジストリでも警告を出せる📦📣

パッケージ配布してる場合、npmには インストール時に非推奨メッセージを表示させる仕組みがあるよ📦⚠️ (npm ドキュメント)

12.7.1 コマンド例(特定バージョンや範囲に出せる)🧾

npm deprecate my-lib@"< 2.3.0" "重大バグあり。v2.3.0以上へ更新してね🙏"

これをやると、対象バージョンを入れようとした人のターミナルにメッセージが出るよ👀✨ (npm ドキュメント)


12.8 “非推奨を使ってたら警告/エラー”を自動化する✅🧪

「見落とし」を防ぐには、ルールで検知して止めるのが強い🔥

12.8.1 ESLint(TypeScript ESLint)の no-deprecated 🧯

@deprecated が付いたAPIの参照を検知するルールがあるよ✅ ただし 型情報が必要だから設定は少しだけ本格的(でも効果大!)💪✨ (TypeScript ESLint)

12.8.2 eslint-plugin-deprecation(別プラグイン)もある🧩

「非推奨利用をレポートする」専用プラグインもあるよ🧪✨ (GitHub)

どっちを使うかは、プロジェクトのESLint構成次第でOK〜😊 大事なのは「CIで拾える形」にすることだよ🚦💥


12.9 よくある失敗パターン集😱🧯

失敗1:代替がない(移行先ゼロ)🙅‍♀️

「非推奨です」って言われても、行き先がなかったら詰む…😭 ➡️ 先に代替APIを作る🛠️✨

失敗2:期限がなくて永久に放置🕰️🫠

ずっと残って、コードが古い/新しいで二重管理に… ➡️ 削除予定(目安)を書く📅✨

失敗3:メッセージが雑で何すればいいか不明😵‍💫

「deprecated」だけだと、利用者が迷子になるよ🌀 ➡️ **代替+期限+リンク(移行ガイド)**🗺️📎

失敗4:非推奨のまま“内部で使い続ける”🧟‍♀️

作った本人たちが使い続けると、永遠に消えないあるある… ➡️ 内部利用を先に置換してから外部へ告知が安全🙂✅


12.10 ミニ演習📝🌸

演習A:非推奨コメントを作る(3点セット)🧁

次の条件で、@deprecated コメントを書いてみよう✨

  • 旧:getUser()
  • 新:getUserById()
  • 削除予定:v2.5.0

✅ 期待する形

  • 「代替」+「期限」が入ってること📣📅

演習B:4ステップ計画を書く🗓️🪜

v2.2.0 で非推奨を出すとして…

  • いつ告知?
  • いつ移行ガイド公開?
  • いつ利用率を見る?(雑でOK)
  • いつ削除?

12.11 AI活用プロンプト例🤖✨

そのままコピペで使えるやつ〜!💖

  • 「この関数を非推奨にしたい。代替API案と、**移行手順(利用者向け)**を作って」🗺️
  • 「既存コードから oldApi() を探して、newApi() に置換するPR案を出して(注意点も)」🔍🔁
  • 「非推奨メッセージを、短くて優しい文章にして。期限と代替を必ず入れて」🌸🧾
  • 「削除予定バージョンを決めたい。影響が大きい契約なので、段階移行の案を3パターン出して」🪜✨

12.12 まとめ🎀✅

  • 非推奨は「壊さずに契約を更新する」ための礼儀🤝🌸
  • 告知→移行→期限→削除の流れが超大事🪜⏳
  • TypeScriptの @deprecated はVS Codeでも気づける形にできるよ🟦👀 (TypeScript)
  • 見落とし防止には ESLint/CIで検知が強い✅🧪 (TypeScript ESLint)
  • npm配布なら npm deprecate でインストール時警告も出せる📦📣 (npm ドキュメント)

(参考)本日時点で npm 上の TypeScript 最新安定版は 5.9.3 と表示されているよ🟦✨ (npmjs.com)