给定一个带有可选属性的类型,包括对具有可选属性的另一个类型的嵌套引用(例如它自己):
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是Partial,而不是因为对象本身。
答案 0 :(得分:0)
现在可以使用内置的Required<T>
来表达它了:
type DeepRequired<T> = Required<{ [P in keyof T]: DeepRequired<T[P]> }>;