1. URL がある作品
  2. URL が無い下書き
  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分

省略可能なプロパティ

あってもなくてもよい項目

作品には公開先の URL が付くことがあります。ただし下書きの作品にはまだ URL がありません。

前回の Work にそのまま url を足すと、URL の無い作品が作れなくなります。

TypeScript

interface Work { id: number; title: string; published: boolean; url: string; } const draft: Work = { id: 2, title: "自己紹介カード", published: false }; // エラー Property 'url' is missing in type ...

プロパティ名の後ろに ? を付けると、省略してよいという意味になります。

TypeScript

interface Work { id: number; title: string; published: boolean; url?: string; } const draft: Work = { id: 2, title: "自己紹介カード", published: false }; const live: Work = { id: 1, title: "プロフィールサイト", published: true, url: "https://example.com/portfolio", };

読むときは undefined を考える

? を付けた瞬間、そのプロパティの型は string ではなく string | undefined になります。無いかもしれない値なので、そのまま使うと止められます。

TypeScript

function domainOf(work: Work): string { return work.url.replace("https://", ""); // エラー 'work.url' is possibly 'undefined'. }

先に有無を確かめれば通ります。

TypeScript

function domainOf(work: Work): string { if (work.url === undefined) { return "未公開"; } return work.url.replace("https://", ""); }

if を抜けた後ろでは work.url は string として扱われます。TypeScript が分岐を読んで型を絞り込んでくれるからです。この絞り込みは第5章の主役になります。

? を付ける基準

省略できるのは「無いことが正常な項目」だけです。title が無い作品はデータの壊れなので ? を付けてはいけません。? を安易に増やすと、読む側が毎回 undefined を確かめる羽目になります。

手を動かす

演習では Work に url? を足し、URL の有無で表示を変える関数を書きます。

要件

  1. Work に url を省略可能なプロパティとして足す
  2. URL があるときは タイトル - URL を返す
  3. URL が無いときは タイトル - リンクはまだありません を返す

入出力例

workLink({"id":1,"published":true,"title":"プロフィールサイト","url":"https://example.com/portfolio"}) → "プロフィールサイト - https://example.com/portfolio" workLink({"id":2,"published":false,"title":"自己紹介カード"}) → "自己紹介カード - リンクはまだありません" workLink({"id":3,"published":true,"title":"スキル一覧の表"}) → "スキル一覧の表 - リンクはまだありません"

ヒント

省略可能にするには、プロパティ名の後ろに `?` を付けます

`?` が付いた値の型には `undefined` が混ざります。そのままつなげると止められます

`if (work.url === undefined)` で先に無い場合を返すと、その後ろでは文字列として扱えます

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

関連レッスン

  • readonly

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

  • interfaceとtype

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

  • ネストした型

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

  • オブジェクト配列

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

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

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

  • URLページの住所全体
  • プロパティメソッドを属性のようにアクセスできるようにするデコレータ。
  • TypeScript静的型を加えた JavaScript の上位互換
  • 関数処理に名前を付けて再利用できる単位
main.ts
学習モード
エディタを読み込んでいます

メモ

省略可能なプロパティ

⌘S で保存