1. 公開中の作品
  2. 下書きの作品
  3. 3 件目も同じ形で出る
コース一覧
TypeScript型設計:オブジェクト・状態・ジェネリクス
interface

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

オブジェクトの形に名前を付ける

第2章では、オブジェクトの形をその場に直接書きました。

TypeScript

const work: { id: number; title: string; published: boolean } = { id: 1, title: "プロフィールサイト", published: true, };

読めますが、同じ形を使う場所が増えるたびに、この長い注釈を書き写すことになります。interface を使うと、形に名前を付けて何度でも呼び出せます。

TypeScript

interface Work { id: number; title: string; published: boolean; } const work: Work = { id: 1, title: "プロフィールサイト", published: true, };

interface の中はカンマではなくセミコロンで区切ります。改行だけでも通りますが、セミコロンを付ける形に慣れておくと読みやすくなります。

契約なので、過不足があると止まる

interface は「この形であること」の約束です。足りなくても、余っていてもエラーになります。

TypeScript

const a: Work = { id: 2, title: "自己紹介カード" }; // エラー Property 'published' is missing in type ... const b: Work = { id: 3, title: "スキル一覧の表", published: false, tag: "HTML" }; // エラー Object literal may only specify known properties, and 'tag' does not exist in type 'Work'.

余分なプロパティまで止めてくれるのが大事なところです。tag を足したつもりが Work を使う全員に影響する、という事故を先に防げます。

関数の引数に使う

いちばん効くのは関数の引数です。

TypeScript

function workTitle(work: Work): string { return work.title; }

こう書くと workTitle は Work の形をしたオブジェクトしか受け取りません。中で work.titel と打ち間違えれば、その場で指摘されます。

この Work は、この先ずっと使い続ける型です。第4章の残りで少しずつ育てて、React のコースまでそのまま持っていきます。だからプロパティ名は、途中で気分によって変えないでください。

手を動かす

演習では Work を自分で定義し、それを引数に取る関数を書きます。プロパティ名は上の 3 つをそのまま使ってください。

要件

  1. Work interface を id title published の 3 プロパティで定義する
  2. workLabel の引数に Work 型を付ける
  3. published が true なら (公開中)、false なら (下書き) を末尾に付ける

入出力例

workLabel({"id":1,"published":true,"title":"プロフィールサイト"}) → "1. プロフィールサイト(公開中)" workLabel({"id":2,"published":false,"title":"自己紹介カード"}) → "2. 自己紹介カード(下書き)" workLabel({"id":3,"published":true,"title":"スキル一覧の表"}) → "3. スキル一覧の表(公開中)"

ヒント

interface の中はカンマではなくセミコロンで区切ります

引数の型注釈は `work` の後ろにコロンをはさんで書きます

公開かどうかで末尾の文字列だけが変わります。if で分けても三項演算子でも構いません

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

関連レッスン

  • 省略可能なプロパティ

    省略できるurlプロパティを足し、必須でない項目を持つ型を作れるようになります。

  • readonly

    idをreadonlyにして書き換え事故を防ぎ、変更禁止を型で守れるようになります。

  • interfaceとtype

    同じ型をinterfaceとtypeの両方で書き比べ、使い分けの基準を持てるようになります。

  • ネストした型

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

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

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

  • オブジェクトキーと値のペアで構造を作るデータ
  • interface実装を持たないメソッド契約。複数 implements 可
  • プロパティメソッドを属性のようにアクセスできるようにするデコレータ。
  • 関数処理に名前を付けて再利用できる単位
  • 引数位置引数=順番で渡す。
main.ts
学習モード
エディタを読み込んでいます

メモ

interface

⌘S で保存