强制类型字段不是可选的

时间:2017-02-24 01:33:38

标签: typescript typescript2.2

给定一个带有可选属性的类型,包括对具有可选属性的另一个类型的嵌套引用(例如它自己):

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

1 个答案:

答案 0 :(得分:0)

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

type DeepRequired<T> = Required<{ [P in keyof T]: DeepRequired<T[P]> }>;