1. ホーム
  2. typescript

[解決済み] Typescript インターフェース内のすべてのプロパティをオプションにする

2022-04-28 15:58:18

質問

私のアプリケーションにインターフェイスがあります。

interface Asset {
  id: string;
  internal_id: string;
  usage: number;
}

は、ポストインターフェイスの一部である。

interface Post {
  asset: Asset;
}

また、アセットオブジェクトが部分的にしか構築されていないような、ポストドラフト用のインターフェイスも用意しました。

interface PostDraft {
  asset: Asset;
}

を許可したい。 PostDraft オブジェクトが部分的なアセットオブジェクトを持ちながら、そこにあるプロパティの型をチェックする(だから、単に any ).

基本的には以下のように生成できる方法が欲しいです。

interface AssetDraft {
  id?: string;
  internal_id?: string;
  usage?: number;
}

を完全に再定義することなく Asset インターフェイスを使用します。このような方法はあるのでしょうか?そうでない場合、この状況で私の型を配置するスマートな方法は何でしょうか?

どのように解決するのですか?

TypeScript 2.1では、オプションのプロパティを持つ追加のインターフェイスを作成しない限り、このようなことはできません。

これを実現するためには Partial<T> という型があり、TypeScriptがデフォルトで提供している。

interface PostDraft {
    asset: Partial<Asset>;
}

これで asset はオプションであるため、以下のようなことが可能になります。

const postDraft: PostDraft = {
    asset: {
        id: "some-id"
    }
};

について Partial<T>

Partial<T> 定義済み を、提供された型のすべてのプロパティをオプションにするマッピングされた型として使用します( ? というトークンを使用します。)

type Partial<T> = {
    [P in keyof T]?: T[P];
};

マッピングされた型についてもっと読む ここで ハンドブックに .

ディープパーシャル

オブジェクトに対して再帰的に動作する部分的な実装が必要な場合、TS 4.1+では以下の型を使用することができます。

type DeepPartial<T> = {
    [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};