オブジェクト配列

Work をまとめて Work[]

作品は普通、1 件ではなく一覧で扱います。配列の型は要素の型に [] を付けるだけなので、Work の配列は Work[] です。

interface Work { readonly id: number; title: string; published: boolean; url?: string; } const works: Work[] = [ { id: 1, title: "プロフィールサイト", published: true }, { id: 2, title: "自己紹介カード", published: false }, { id: 3, title: "スキル一覧の表", published: true }, ];

要素が 1 つでも形を外れていれば、その要素の位置でエラーになります。どの行が悪いのかまで教えてくれるので、データの取り違えを一覧単位で防げます。

取り出した要素にも型が付く

Work[] から取り出したものは Work です。だから続けてドットで読めます。

const first = works[0]; console.log(first.title); // プロフィールサイト

map と filter が効くようになる

第3章で見たコールバックの型が、ここで本領を発揮します。

const titles: string[] = works.map((work) => work.title);

worksWork[] なので、コールバックの work は書かなくても Work に決まります。work.titlestring なので、map の結果は string[] と推論されます。ここで work.titel と打てば止まりますし、結果を number[] に入れようとしても止まります。

filter も同じです。

const published: Work[] = works.filter((work) => work.published);

filter は要素を選ぶだけなので、結果の型は元と同じ Work[] です。この 2 つをつなぐと、一覧の加工がひととおり書けます。

const publishedTitles: string[] = works .filter((work) => work.published) .map((work) => work.title);

React で作品カードを並べるときに書くのは、まさにこの形です。

手を動かす

演習では Work[] を受け取り、公開中の作品だけのタイトル一覧を返す関数を書きます。

要件

  1. publishedTitles の引数に Work の配列を表す型を付ける
  2. published が true の作品だけを残す
  3. 残した作品の title だけを並べた配列を返す

入出力例

publishedTitles([{"id":1,"published":true,"title":"プロフィールサイト"},{"id":2,"published":false,"title":"自己紹介カード"},{"id":3,"published":true,"title":"スキル一覧の表"}])["プロフィールサイト","スキル一覧の表"] publishedTitles([{"id":1,"published":true,"title":"プロフィールサイト"},{"id":2,"published":true,"title":"自己紹介カード"}])["プロフィールサイト","自己紹介カード"] publishedTitles([{"id":2,"published":false,"title":"自己紹介カード"}])[] publishedTitles([])[] publishedTitles([{"id":3,"published":true,"title":"スキル一覧の表","url":"https://example.com/skills"}])["スキル一覧の表"]

ヒント

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

メモ

オブジェクト配列

⌘S で保存