1. 読み込み成功。3 件中 2 件が公開中
  2. 読み込み中
  3. 読み込み失敗
  4. 成功したが公開作品が無い
  5. 成功したが作品自体が無い
  6. すべて公開中
コース一覧
JavaScriptをTypeScriptへ移行する
つくる - 丸ごとTS化完了

JavaScriptをTypeScriptへ移行する

tsconfigとstrict設定、移行順序、データ層・関数・DOMの型付け、型エラーの解消を通して、既存JavaScriptを段階的にTypeScriptへ移行する全9レッスンの実践プロジェクトです。完成済みのプロフィールサイトを止めずに、ファイル単位で安全なTypeScriptへ置き換えます。

1
実践 JSをTSに移行する
01. tsconfigのきほん10分
02. 移行の進め方10分
03. データ層のTS化15分
04. 関数のTS化15分
05. 型エラーを潰す15分
06. DOMと型15分
07. つくる - 丸ごとTS化完了20分
08. 自由移行20分
09. 完成と次のステップ10分

つくる - 丸ごとTS化完了

移行の終点

この回で新しい知識は出てきません。データ層、ユーティリティ、画面まわりと下から上げてきた 3 つを、1 本の関数につなぎます。React入門で書いたポートフォリオの、表示用のまとめ文を作る部分です。

使うのは第4章の interface、第5章の union と分岐、第6章から続く配列メソッドの型です。

つなぐ相手

もとの JavaScript はこうでした。

JavaScript

function buildPortfolioSummary(works, status) { const titles = works.filter((work) => work.published).map((work) => work.title); return "公開作品は" + titles.length + "件です。" + titles.join("、"); }

動きますが、通信中でも失敗しても同じ文が出ます。作品が 0 件のときは、うしろに何も付かない中途半端な文になります。

形を 2 つ決める

先に型です。作品 1 件の形と、読み込みの状態の 2 つを決めます。

TypeScript

interface Work { id: number; title: string; published: boolean; } type LoadStatus = "loading" | "success" | "error";

LoadStatus を文字列リテラルの union にしておくと、打ち間違いがその場で止まります。

TypeScript

buildPortfolioSummary(works, "succes"); // エラー Argument of type '"succes"' is not assignable to // parameter of type 'LoadStatus'.

status: string にしていたら、この呼び出しは通ってしまい、画面には何も出ないまま原因が分からなくなります。取りうる値が決まっているものは、string ではなく union にする。これが第5章の結論でした。

状態を先に、中身をあとに

分岐の順番は、外側の状態が先です。

TypeScript

if (status === "loading") { return "読み込み中です"; } if (status === "error") { return "読み込みに失敗しました"; }

ここを抜けた時点で、status は "success" に絞り込まれています。TypeScript も同じように絞っているので、この先で status にホバーすると "success" とだけ出ます。

残りは中身の話です。公開作品が 1 件も無いときは、件数を並べても意味がないので別の文にします。

手を動かす

引数に型を通し、状態の分岐と 0 件の分岐を足してください。順番はいつもどおり、型を付けてから中身です。

この関数が通ったら、React入門のコードのうち関数とデータ層は、丸ごと TypeScript に載りました。ここで作った Work と LoadStatus は、そのまま次のコースへ持っていきます。

要件

  1. 作品 1 件の形を Work という名前で定義する
  2. 読み込み状態を loading と success と error だけを取る型として定義する
  3. 引数と戻り値に型を付ける
  4. loading のときは 読み込み中です を返す
  5. error のときは 読み込みに失敗しました を返す
  6. success で公開作品が 0 件のときは 公開作品はまだありません を返す

入出力例

buildPortfolioSummary([{"id":1,"published":true,"title":"プロフィールサイト"},{"id":2,"published":false,"title":"自己紹介カード"},{"id":3,"published":true,"title":"スキル一覧の表"}], "success") → "公開作品は2件です。プロフィールサイト、スキル一覧の表" buildPortfolioSummary([], "loading") → "読み込み中です" buildPortfolioSummary([{"id":1,"published":true,"title":"プロフィールサイト"}], "error") → "読み込みに失敗しました" buildPortfolioSummary([{"id":9,"published":false,"title":"下書きメモ"}], "success") → "公開作品はまだありません" buildPortfolioSummary([], "success") → "公開作品はまだありません" buildPortfolioSummary([{"id":1,"published":true,"title":"プロフィールサイト"},{"id":2,"published":true,"title":"自己紹介カード"}], "success") → "公開作品は2件です。プロフィールサイト、自己紹介カード"

ヒント

先に `interface Work` と、状態を表す文字列リテラルの union を書きます

状態の分岐を先に済ませると、そのあとは `success` の場合だけを考えれば済みます

公開作品が 0 件かどうかは、絞り込んだあとの配列の長さで判定できます

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/06

関連レッスン

  • 自由移行

    過去に自分で書いたコードを1本選び、TypeScriptへ移行します。

  • 完成と次のステップ

    移行したコードを振り返り、React実践へ進む道筋を確認します。

  • DOMと型

    フォーム取得のコードに型を付け、DOM操作の型を扱えるようになります。

  • 型エラーを潰す

    移行で出た型エラーを全部読み解いて解消し、エラーメッセージを自力で直せるようになります。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 関数処理に名前を付けて再利用できる単位
  • 配列サイズ固定の同型データの集まり
  • メソッドクラスに属する関数
  • JavaScriptWeb で動的な振る舞いを担う言語
  • TypeScript静的型を加えた JavaScript の上位互換
  • ホバーマウスを乗せた瞬間に発火する状態
  • 引数位置引数=順番で渡す。
  • 戻り値呼び出し元への返答を表す点線矢印
main.ts
学習モード
エディタを読み込んでいます

メモ

つくる - 丸ごとTS化完了

⌘S で保存