1

给定具有可选属性的类型,包括对具有可选属性的另一种类型(例如其自身)的嵌套引用:

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 是部分的,而不是因为对象本身。

4

1 回答 1

0

这现在可以使用Required<T>内置的来表达:

type DeepRequired<T> = Required<{ [P in keyof T]: DeepRequired<T[P]> }>;
于 2019-06-19T20:33:38.480 回答