给定具有可选属性的类型,包括对具有可选属性的另一种类型(例如其自身)的嵌套引用:
type Foo = {
fieldA?: string,
fieldB?: number,
fieldDeep?: Foo,
};
有没有办法生成该类型的版本,其中所有属性现在都是非可选的:
type RequiredFoo = {
fieldA: string,
fieldB: number,
fieldDeep: RequiredFoo,
};
这种类型本质上是 Partial 的深层形式的相反,这是可行的:
type DeepPartial<T> = {
[P in keyof T]?: DeepPartial<T[P]>
};
我想出了一个奇怪的技巧来浅浅地处理一个类型的实例:
function required<T>(obj: Partial<T>): { [P in keyof T]: T[P] } {
return obj as any;
}
const requiredFoo: {
fieldA: string,
fieldB: number,
fieldDeep: Foo,
} = required({} as Foo);
但是我找不到递归表达这种类型的方法,主要是因为我无法将上面的函数表达为实际的类型定义——它之所以起作用是因为obj: Partial<T>
参数,也许是因为它推断出任何可选参数是由于 obj 是部分的,而不是因为对象本身。