在 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

