1. 公開中の作品
  2. 下書きの作品
  3. URL 付きの作品
コース一覧
TypeScript型設計:オブジェクト・状態・ジェネリクス
ネストした型

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分

ネストした型

オブジェクトの中のオブジェクト

作品に、誰が作ったかの情報を持たせます。作者は名前とニックネームの 2 つを持つので、それ自体がオブジェクトになります。

型は入れ子にして書けます。

TypeScript

interface Work { readonly id: number; title: string; published: boolean; author: { name: string; nickname: string }; }

値のほうも同じ形で入れ子になります。

TypeScript

const work: Work = { id: 1, title: "プロフィールサイト", published: true, author: { name: "ゆめさく", nickname: "yume" }, };

読むときはドットをつないでいきます。

TypeScript

console.log(work.author.nickname); // yume

内側にも名前を付ける

入れ子をそのまま書くと、階層が深くなるほど読みにくくなります。内側にも名前を付けて分けるほうが扱いやすくなります。

TypeScript

interface Author { name: string; nickname: string; } interface Work { readonly id: number; title: string; published: boolean; author: Author; }

意味は上と同じですが、Author だけを引数に取る関数が書けるようになります。

TypeScript

function authorLabel(author: Author): string { return author.name + "(" + author.nickname + ")"; }

型に名前を付けるかどうかの目安は、その形が 2 か所以上で登場するか、単独で関数に渡したくなるか、です。どちらかに当てはまったら切り出します。

入れ子でも検査は届く

内側の打ち間違いも、ちゃんと止まります。

TypeScript

work.author.nickname = 123; // エラー Type 'number' is not assignable to type 'string'. console.log(work.auther.name); // エラー Property 'auther' does not exist on type 'Work'.

手を動かす

演習では Author を切り出して Work に組み込み、作者名まで含む一行を返す関数を書きます。ここで決めた author の形も、後の章でそのまま使い続けます。

要件

  1. Author を name と nickname の 2 プロパティで定義する
  2. Work に author プロパティを足し、その型を Author にする
  3. タイトル / 名前(ニックネーム) の形で返す。カッコは全角を使う

入出力例

workByLine({"author":{"name":"ゆめさく","nickname":"yume"},"id":1,"published":true,"title":"プロフィールサイト"}) → "プロフィールサイト / ゆめさく(yume)" workByLine({"author":{"name":"たなか","nickname":"tanaka"},"id":2,"published":false,"title":"自己紹介カード"}) → "自己紹介カード / たなか(tanaka)" workByLine({"author":{"name":"さとう","nickname":"sato"},"id":3,"published":true,"title":"スキル一覧の表","url":"https://example.com/skills"}) → "スキル一覧の表 / さとう(sato)"

ヒント

先に `Author` を定義してから、`Work` の中で `author: Author` と書きます

入れ子の値はドットをつないで読みます。`work.author.nickname` の形です

つなぐカッコは全角の `(` と `)` です。半角と混ぜないでください

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

関連レッスン

  • オブジェクト配列

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

  • つくる - Work型とProfile型

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

  • 第4章クイズ

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

  • union型

    文字列または数値を受ける値を書き、AまたはBを型にできるようになります。

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

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

  • オブジェクトキーと値のペアで構造を作るデータ
  • 階層ネットワークを役割ごとに積み重ねた構造
  • 引数位置引数=順番で渡す。
  • 関数処理に名前を付けて再利用できる単位
  • プロパティメソッドを属性のようにアクセスできるようにするデコレータ。
main.ts
学習モード
エディタを読み込んでいます

メモ

ネストした型

⌘S で保存