我有一个这样的模型:
interface User {
firstName: string;
lastName: string;
gender: 'male' | 'female';
}
我想要一种通用的方法来创建基于此模型的 Angular-Form 类型。我的第一个方法:
export type ModelForm<T> = FormGroup<{
[K in keyof T]: FormControl<T[K]>;
}>
我可以像这样输入我的 UserModelForm
const myForm: ModelForm<User>
,一切都是正确的。
但是如果我的模型中有数组和对象怎么办?例如:
interface User {
firstName: string;
lastName: string;
gender: 'male' | 'female';
validity: {
validFrom: Date,
validUntil: Date | null,
}
addresses: {street: string, houseNumber:number}[],
}
我该如何处理这个问题?
这是您的答案的解决方案,但由于理解所需类型的复杂性,不建议这样做。
1,
T[K] extends (infer U)
表示如果实例是某种数组,则将其视为 fromArray
2,
T[K] extends object
表示如果实例是对象,那么它可能是 formGroup 或 formControl。
type CustomType<T> = {
[K in keyof T]: T[K] extends (infer U)[]
? FormArray<FormControl<U> | FormGroup<CustomType<U>>>
: T[K] extends object
? FormGroup<CustomType<T[K]>>
: FormControl<T[K]>;
};