Typescript 强制类型';s字段不是可选的

Typescript 强制类型';s字段不是可选的,typescript,typescript2.2,Typescript,Typescript2.2,给定一个具有可选属性的类型,包括对另一个具有可选属性(如自身)的类型的嵌套引用: 是否有一种方法可以生成该类型的版本,其中所有属性现在都是非可选的: type RequiredFoo = { fieldA: string, fieldB: number, fieldDeep: RequiredFoo, }; 这种类型本质上与部分的深层形式相反,这是可行的: type DeepPartial<T> = { [P in keyof T]?: DeepPa

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

是否有一种方法可以生成该类型的版本,其中所有属性现在都是非可选的:

type RequiredFoo = {
    fieldA: string,
    fieldB: number,
    fieldDeep: RequiredFoo,
};
这种类型本质上与部分的深层形式相反,这是可行的:

type DeepPartial<T> = {
    [P in keyof T]?: DeepPartial<T[P]>
};
类型DeepPartial={
[P in keyof T]?:深度部分
};
我想出了一个奇怪的诀窍,对类型的实例执行此操作:

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):{[P in keyof T]:T[P]}{
返回obj(如有);
} 
const requiredFoo:{
菲尔达:弦,
字段B:编号,
菲尔德迪普:福,
}=必需({}作为Foo);

但是我找不到一种方法来递归地表达这个类型,主要是因为我无法将上面的函数表示为一个实际的类型定义---它工作的原因是因为
obj:Partial
参数,可能是因为它推断出任何可选参数都是由于obj是Partial的,而不是因为对象本身。

现在可以使用
所需的
内置:

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

现在可以使用
所需的
内置:

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

这很有趣,但我猜您试图解决的问题是错误的,因为这是一个非常复杂的问题。i、 它更可能需要类型中的某些属性,而保留其他属性的可选性。我的20美分。您是否有可以共享的特定用例?我想了解这可以应用于什么应用程序。试试这个
type Required=T extends对象?{[P in keyof T]-?:不可为空;}:T
让我知道,如果这行得通,我将作为答案发布…Typescript自那时起已更新,现在这是一种内置的
Required
,它在标准库中定义。然而,这(我相信还有你的)不是必需的。如果你提供一个递归工作的答案,我会接受。这很有趣,但我猜你是在试图解决错误的问题,因为这是一个非常复杂的问题。i、 它更可能需要类型中的某些属性,而保留其他属性的可选性。我的20美分。您是否有可以共享的特定用例?我想了解这可以应用于什么应用程序。试试这个
type Required=T extends对象?{[P in keyof T]-?:不可为空;}:T
让我知道,如果这行得通,我将作为答案发布…Typescript自那时起已更新,现在这是一种内置的
Required
,它在标准库中定义。然而,这(我相信还有你的)不是必需的。我会接受一个答案,如果你提供一个递归工作。