Typescript は「サブセット型」をサポートしていますか? 質問する

Typescript は「サブセット型」をサポートしていますか? 質問する

次のようなインターフェースがあるとします。

interface IUser {
  email: string;
  id: number;
  phone: string;
};

次に、次のような関数を用意します。サブセット(または完全一致) がその型に該当します。オブジェクト全体が渡されるかもしれませんし、単に渡されるかもしれません。型チェッカーで両方を許可するようにしたいのです。{email: "[email protected]"}

例:

function updateUser(user: IUser) {
  // Update a "subset" of user attributes:
  $http.put("/users/update", user);
}

Typescript はこの種の動作をすでにサポートしていますか? 特に Redux のようなパラダイムでは、非常に便利だと思います。

明確に言えば、目標は次のとおりです。

  1. インターフェイスを書き直したり、すべての属性を手動でオプションに設定したりすることは避けてください。
  2. 予期しない属性(スペルミスなど)の割り当てを避けてください。
  3. ifコンパイル時の型チェックの利点を失うステートメントなどの命令型ロジックは避けてください。

アップデート:Typescriptは、以下のサポートを発表しました。マップされたタイプ公開されるとこの問題は解決されるはずです。

ベストアンサー1

Partial<T>承認された回答で示唆されているように、は全てフィールドはオプションであり、必ずしも必要ではありません。

いくつかのフィールドを必須にしたい場合 (例:idおよびemail)、 を と組み合わせる必要がありますPick

type UserWithOptionalPhone = Pick<IUser, 'id' | 'email'> & Partial<IUser>

説明:

それPickは、インターフェースのサブセットを簡潔に指定し(他の回答で提案されているように、フィールドタイプを繰り返す新しいインターフェース全体を作成することなく)、それらを使用できるようにし、それだけ田畑。

function hello1(user: Pick<IUser, 'id' | 'email'>) {
}

hello1({email: '@', id: 1}); //OK

hello1({email: '@'}); //Not OK, id missing

hello1({email: '@', id: 1, phone: '123'}); //Not OK, phone not allowed

さて、これは私たちが必要としているものではありません。許可する、 だがしかし必要とする電話。そのためには、部分的な型と「選択された」型を「マージ」して、交差点タイプすると、 と が必須フィールドとなりidemailその他はすべてオプションになります。まさに私たちが望んでいたとおりです。

function hello2(user: Pick<IUser, 'id' | 'email'> & Partial<IUser>) {
}

hello2({email: '@', id: 1}); //OK

hello2({email: '@', id: 1, phone: '123'}); //OK

hello2({email: '@'}); //Not OK, id missing

おすすめ記事