Angular 键入键相似但值不同的对象

Angular 键入键相似但值不同的对象,angular,typescript,Angular,Typescript,我有一个人类对象 interface Human { ID: number; gender: string; hobbies?: string[]; } 我想创建一个具有类似结构的FormGroup,如何声明FormGroup对象的类型 interface HumanFormGroup { ID: FormControl, gender: FormControl, hobbies?: FormArray } 我正在手动创建此FormGroup,

我有一个
人类
对象

interface Human {
    ID: number;
    gender: string;
    hobbies?: string[];
}
我想创建一个具有类似结构的FormGroup,如何声明FormGroup对象的类型

interface HumanFormGroup {
    ID: FormControl,
    gender: FormControl,
    hobbies?: FormArray
}
我正在手动创建此FormGroup,但希望我可以执行以下操作:

const humanForm: ValueAny<Human>
const人形:ValueAny
可能吗

p/S:我问这个问题是因为有可用的
部分
修饰符,但不确定是否有任何“ValueAny”修饰符?

您可以使用和来实现这一点。映射类型将映射原始类型的属性,而条件类型将根据属性是否为数组来转换其原始类型

interface Human {
    ID: number;
    gender: string;
    hobbies?: string[];
}

type ValueAny<T> = {
  [P in keyof T] : T[P] extends any[] ? FormArray : FormControl 
}

type HumanFormGroup = ValueAny<Human>
// Will be quivalent to
// {
//     ID: FormControl,
//     gender: FormControl,
//     hobbies?: FormArray
// }
人机界面{
ID:编号;
性别:弦;
爱好?:字符串[];
}
类型值any={
[P in keyof T]:T[P]扩展任何[]?FormArray:FormControl
}
类型HumanFormGroup=ValueAny
//将等同于
// {
//ID:FormControl,
//性别:表格控制,
//爱好?:正式聚会
// }

您可以进一步使映射规则复杂化,但从您的问题中,我推断出了这些需求

任何数组属性都应映射到
FormArray
,其余属性应映射到
FormControl
?嵌套对象是如何处理的?只是问一下,你熟悉角度吗?要创建一个反应式表单,我们需要创建一个表单结构,通常具有与底层对象相似的结构。如何指定表单对象?只是想知道大多数棱角分明的用户是如何处理打字问题的?手动声明,或仅指定为任何,或使用您建议的方法?