Angular/TypScript:基于模型为表单创建类型

问题描述 投票:0回答:1

我有一个这样的模型:

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}[],
}

我该如何处理这个问题?

angular typescript
1个回答
0
投票

这是您的答案的解决方案,但由于理解所需类型的复杂性,不建议这样做。

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]>;
};
© www.soinside.com 2019 - 2024. All rights reserved.