省略可能なプロパティ

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

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

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

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

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

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 になります。無いかもしれない値なので、そのまま使うと止められます。

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

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

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

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

? を付ける基準

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

手を動かす

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

要件

  1. Workurl を省略可能なプロパティとして足す
  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":"スキル一覧の表"})"スキル一覧の表 - リンクはまだありません"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.ts
main.ts
学習モード

メモ

省略可能なプロパティ

⌘S で保存