1. 公開中の作品だけを取り出す
  2. 非公開の作品だけを取り出す
  3. 一致するものが 1 件も無い
  4. 作品がまだ 1 件も無い
  5. published だけを持つオブジェクトでも使える
  6. 元の並び順を保つ
コース一覧
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分

つくる - 汎用フィルタ関数

第6章でやったことを 1 本にする

この回で新しい知識は出てきません。第6章で覚えたことだけを組み合わせて、汎用のフィルタ関数を仕上げます。

使うのは次の 3 つです。1 つ目は型引数の宣言です。2 つ目は、引数と戻り値の両方に同じ型引数を使うことです。3 つ目は extends による制約です。

作る相手

published を見て、指定した公開状態の要素だけを残す関数です。作品にも、下書きにも、published を持つものなら何にでも使えるようにします。

TypeScript

const works = [ { id: 1, title: "プロフィールサイト", published: true }, { id: 2, title: "自己紹介カード", published: false }, ]; filterBy(works, true); // [{ id: 1, title: "プロフィールサイト", published: true }]

型引数を使い切る

戻り値を object[] にしてしまうと、返ってきた要素の title が読めなくなります。受け取った型をそのまま返す、という関係を型引数で表してください。

TypeScript

const open = filterBy(works, true); open[0].title; // ここが読めることがゴール

引数を T[]、戻り値を T[] と書けば、呼び出しごとに T が決まり、title も id もそのまま残ります。

中で使うものだけ要求する

関数の中で読むのは published だけです。だから制約も published だけを要求します。

TypeScript

<T extends { published: boolean }>

title や id まで要求すると、使える相手が減ります。制約は必要な分だけにする、が原則です。

手を動かす

引数の型、制約、戻り値の型、そして組み立て用の配列の型を書いて、処理を完成させてください。書き上がったら、返ってきた配列の要素から title が読めるか、頭の中で確かめてみてください。読めなければ、どこかで型引数が途切れています。

要件

  1. 型引数を 1 つ宣言し、published が boolean である型だけを受け取る制約を付ける
  2. 第 1 引数は宣言した型引数の配列、戻り値も同じ型引数の配列にする
  3. 第 2 引数は boolean にする
  4. 受け取った配列は書き換えず、新しい配列を返す
  5. any は使わない

入出力例

filterBy([{"id":1,"published":true,"title":"プロフィールサイト"},{"id":2,"published":false,"title":"自己紹介カード"},{"id":3,"published":true,"title":"スキル一覧の表"}], true) → [{"id":1,"published":true,"title":"プロフィールサイト"},{"id":3,"published":true,"title":"スキル一覧の表"}] filterBy([{"id":1,"published":true,"title":"プロフィールサイト"},{"id":2,"published":false,"title":"自己紹介カード"}], false) → [{"id":2,"published":false,"title":"自己紹介カード"}] filterBy([{"id":1,"published":true,"title":"プロフィールサイト"}], false) → [] filterBy([], true) → [] filterBy([{"published":false},{"published":true}], true) → [{"published":true}] filterBy([{"id":1,"published":true,"title":"a"},{"id":2,"published":true,"title":"b"},{"id":3,"published":false,"title":"c"}], true) → [{"id":1,"published":true,"title":"a"},{"id":2,"published":true,"title":"b"}]

ヒント

型引数の宣言と制約は、関数名の後ろに山カッコで続けて書きます

戻り値を `object[]` にすると `title` が読めなくなります。引数と同じ型引数の配列を返します

組み立て用の配列にも型引数の配列型を書いておくと、`push` の中身まで検査されます

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

関連レッスン

  • 第6章クイズ

    ジェネリクスと型の制約の理解を確認します。

  • 組み込みのジェネリクス

    fetch結果の型を読み解き、ArrayやPromiseの型引数を読めるようになります。

  • 制約付きジェネリクス

    idを持つ物だけを受け取る関数を書き、型引数に条件を付けられるようになります。

  • 配列を返す汎用関数

    配列を逆順で返す関数を書き、配列の入出力を型引数で表せるようになります。

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

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

  • 関数処理に名前を付けて再利用できる単位
  • 引数位置引数=順番で渡す。
  • 戻り値呼び出し元への返答を表す点線矢印
  • 配列サイズ固定の同型データの集まり
  • 処理計算や代入を表す長方形
main.ts
学習モード
エディタを読み込んでいます

メモ

つくる - 汎用フィルタ関数

⌘S で保存