網站搜尋

在 TypeScript 中對嵌套屬性使用 Partial


假設我有這樣的一種類型;

interface State {
  one: string,
  two: {
    three: {
      four: string
    },
    five: string
  }
}

我像這樣將 state 設為 Partial:Partial<State>

但是我如何才能使其中一個巢狀屬性變為部分的,例如,如果我想讓 two 也變為部分的。

我該怎麼做這個?

答案#1

你可以相當容易地定義你自己的 RecursivePartial 類型,這將使所有屬性,包括嵌套的屬性,變為可選的:

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

如果你只想讓你的一些屬性是部分的,那麼你可以將這個與交集和 Pick 一起使用:

type PartialExcept<T, K extends keyof T> = RecursivePartial<T> & Pick<T, K>;

那會使所有內容變為可選,除了在 K 參數中指定的鍵。

答案#2

這是可能的,你可以按以下方式創建一個「深層」部分類型:

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

可以如下使用

const state: DeepPartial<State> = {
    two: {
        three: {
            four: '4'
        }
    }
}

答案#3

物件上的陣列屬性

對於 TypeScript 2.8 或更新版本,以下類型應該可以解決關於 Array 屬性的問題:

type NestedPartial<T> = {
    [K in keyof T]?: T[K] extends Array<infer R> ? Array<NestedPartial<R>> : NestedPartial<T[K]>
};

請參見以下範例。

interface Foo {
    NumProp: number;
    SubItem: Foo;
    SubItemArray: Foo[];
}

帶有條件類型的有效結果

無效結果

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