第8章. ヘルパー・タイプ
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
TypeScriptの強みの一つは、他の型から型を派生させることができることだ。これにより、ある型の更新が派生したすべての型に自動的にトリクルされるような、型間の関係を定義することができる。これによってメンテナンスが軽減され、最終的にはより堅牢な型のセットアップが可能になる。
派生型を作成する場合、通常は同じ型の修正を異なる組み合わせで適用する。TypeScriptにはすでに組み込みのユーティリティ型のセットがあり、そのいくつかは本書ですでに見てきた。しかし、それだけでは不十分な場合もある。状況によっては、既知のテクニックを別の方法で適用したり、型システムの内部構造を深く掘り下げて望みの結果を得たりする必要がある。そのような場合には、独自のヘルパー型のセットが必要になるかもしれない。
この章では、ヘルパー型の概念を紹介し、カスタム・ヘルパー型によって型を派生する能力が飛躍的に向上する使用例をいくつか紹介する。それぞれの型は異なる状況で機能するように設計されており、それぞれの型が型システムの新しい側面を教えてくれるはずだ。もちろん、ここで紹介する型のリストは決して完全なものではないが、良いエントリポイントになり、手を広げるのに十分なリソースを与えてくれる。
結局のところ、TypeScriptの型システムは独自の関数型メタプログラミング言語とみなすことができ、小さな単一の目的のヘルパー型と大きなヘルパー型を組み合わせることで、既存のモデルに単一の型を適用するのと同じくらい簡単に型派生を行うことができる。
8.1 特定のプロパティをセットする オプション
問題
特定のプロパティをオプションとして設定するタイプを導き出したい。
解決策
SetOptional 、2つのオブジェクト・タイプを積集合するカスタム・ヘルパー・タイプを作成する。1つは、オプションのmapped type修飾子を用いて選択されたすべてのプロパティをマッピングするものであり、もう1つは、残りのすべてのプロパティをマッピングするものである。
ディスカッション
TypeScriptプロジェクトのモデルはすべてセットされ、定義されている:
typePerson={name:string;age:number;profession:string;};
よくある状況として、次のようなものがある。Personのようなものが必要だが、すべてのプロパティをセットする必要はない。こうすることで、似たような形をしているが1つか2つのフィールドが欠けている他の構造体や型に対して、APIをより開かれたものにすることができる。異なる型を維持するのではなく(レシピ12.1を参照)、まだ使用されているオリジナルのモデルから派生させるのだ。
TypeScriptには、すべてのプロパティをオプショナルに変更するPartial<T> という組み込みのヘルパー型がある:
typePartial<T>={[PinkeyofT]?:T[P];};
これは、すべてのキーにマッピングされ、optional mapped type修飾子を使って各プロパティをoptionalに設定するマッピング型である。SetOptional 型を作る最初のステップは、オプショナルに設定できるキーのセットを減らすことだ:
typeSelectPartial ...