ネストした型

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

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

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

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

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

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

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

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

内側にも名前を付ける

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

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

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

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

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

入れ子でも検査は届く

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

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. Authornamenickname の 2 プロパティで定義する
  2. Workauthor プロパティを足し、その型を 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)"

ヒント

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

メモ

ネストした型

⌘S で保存