1. 公開済みのおすすめ作品
  2. URL 付きのおすすめ作品
  3. 下書きでもラベルは出る
コース一覧
TypeScript型設計:オブジェクト・状態・ジェネリクス
interfaceとtype

TypeScript型設計:オブジェクト・状態・ジェネリクス

interface、optional property、readonly、union・リテラル型、型ガード、ジェネリクスを扱う全23レッスンの型設計コースです。Profile・Work・ApplicationStateを題材に、APIや画面で扱うデータと状態を壊れにくい型として設計します。既存JavaScriptプロジェクトの移行は次のコースで扱います。

1
オブジェクト型とinterface
01. interface15分
02. 省略可能なプロパティ15分
03. readonly15分
04. interfaceとtype15分
05. ネストした型15分
06. オブジェクト配列15分
07. つくる - Work型とProfile型20分
08. 第4章クイズ15分
2
union・リテラル型・型ガード
01. union型15分
02. リテラル型15分
03. 状態のunion15分
04. typeofで絞り込む15分
05. inと判別で絞り込む15分
06. 状態で表示を切り替える15分
07. つくる - 状態の型表現20分
08. 第5章クイズ15分
3
ジェネリクス入門
01. なぜジェネリクスか10分
02. ジェネリック関数15分
03. 配列を返す汎用関数15分
04. 制約付きジェネリクス15分
05. 組み込みのジェネリクス15分
06. つくる - 汎用フィルタ関数20分
07. 第6章クイズ15分

interfaceとtype

同じ形が 2 通りで書ける

第2章で type を、前回まで interface を使いました。オブジェクトの形を書くだけなら、この 2 つはほぼ同じ結果になります。

TypeScript

interface Work { readonly id: number; title: string; published: boolean; url?: string; } type Work2 = { readonly id: number; title: string; published: boolean; url?: string; };

type は等号を使い、末尾にセミコロンが要ります。interface は等号を使いません。どちらで書いても、代入できる値は同じです。

増やすときの書き方が違う

差が出るのは、既にある型に項目を足すときです。interface は extends で受け継ぎます。

TypeScript

interface FeaturedWork extends Work { comment: string; }

type は & でつなぎます。これを交差型と呼びます。

TypeScript

type FeaturedWork = Work & { comment: string };

どちらも「Work の全項目 + comment」という同じ形になります。

TypeScript

const pick: FeaturedWork = { id: 1, title: "プロフィールサイト", published: true, comment: "初めて自分で作ったページです", };

使い分けの基準

迷ったときの目安は次のとおりです。オブジェクトの形に名前を付けるなら interface を選びます。React の props のように、後から誰かが項目を足して広げていく型と相性がよいからです。

一方 type にしかできないことがあります。string | number のような union、タプル、他の型からの計算などです。これらは interface では書けません。

TypeScript

type WorkId = number; type Status = "draft" | "published";

つまり type のほうが守備範囲は広く、interface はオブジェクト専用のかわりに拡張の意図が読み取りやすい、という関係です。同じプロジェクトの中では、どちらを既定にするかを決めて揃えるのがいちばん大事です。

手を動かす

演習では Work を土台にして、おすすめ作品を表す型を作ります。extends と & のどちらで書いても構いません。

要件

  1. FeaturedWork が Work のプロパティをすべて受け継ぐようにする
  2. 受け継ぎには extends か & を使う。プロパティを手で書き写さない
  3. featuredLabel は タイトル - コメント の形で返す

入出力例

featuredLabel({"comment":"初めて自分で作ったページです","id":1,"published":true,"title":"プロフィールサイト"}) → "プロフィールサイト - 初めて自分で作ったページです" featuredLabel({"comment":"表組みの練習に作りました","id":3,"published":true,"title":"スキル一覧の表","url":"https://example.com/skills"}) → "スキル一覧の表 - 表組みの練習に作りました" featuredLabel({"comment":"配色を練習中です","id":2,"published":false,"title":"自己紹介カード"}) → "自己紹介カード - 配色を練習中です"

ヒント

`interface FeaturedWork extends Work` と書くと、Work の項目をそのまま受け継げます

`type FeaturedWork = Work & { comment: string };` でも同じ形になります

プロパティを書き写して増やすのは避けてください。Work を直したときに追随できなくなります

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

関連レッスン

  • ネストした型

    Workの中のauthor情報を型にし、入れ子になった形を定義できるようになります。

  • オブジェクト配列

    作品一覧にWorkの配列として型を通し、オブジェクト配列を安全に扱えるようになります。

  • つくる - Work型とProfile型

    トラック共通のWork型とProfile型を完成させ、React実践へ持ち込める資産にします。

  • 第4章クイズ

    interfaceとオブジェクト型の理解を確認します。

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

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

  • オブジェクトキーと値のペアで構造を作るデータ
  • タプル順序付きで変更不可のシーケンス
  • プロパティメソッドを属性のようにアクセスできるようにするデコレータ。
main.ts
学習モード
エディタを読み込んでいます

メモ

interfaceとtype

⌘S で保存