1. ホーム
  2. typescript

TypeScriptで再帰的なPartial<T>を使う

2023-12-21 11:06:18

質問

このようなインターフェイスがあります。

export interface UserSettings
{
    one: {
        three: number;
        four: number;
    };
    two: {
        five: number;
        six: number;
    };
}

...そして、これをこうしたい。

export interface UserSettingsForUpdate
{
    one?: {
        three?: number;
        four?: number;
    };
    two?: {
        five?: number;
        six?: number;
    };
}

...しかし Partial<UserSettings> はこれを生成します。

{
    one?: {
        three: number;
        four: number;
    };
    two?: {
        five: number;
        six: number;
    };
}

マップされた型を使用して、すべての深さのすべてのプロパティをオプションにすることは可能ですか、それともそのために手動でインターフェースを作成する必要がありますか?

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

2.8で条件付き型の上陸により、以下のように再帰的な部分型を宣言できるようになりました。

type RecursivePartial<T> = {
  [P in keyof T]?:
    T[P] extends (infer U)[] ? RecursivePartial<U>[] :
    T[P] extends object ? RecursivePartial<T[P]> :
    T[P];
};

参照

http://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html