在 Angular 中派生类型化 FormGroup 的值的类型

Mat*_*ers 3 typescript angular angular-forms

使用 Angular 中新的类型化表单控件,我们可以做到这一点:

interface MyFormGroup {
    id: FormControl<number | null>;
    name: FormControl<string | null>;
    email: FormControl<string | null>;
}
Run Code Online (Sandbox Code Playgroud)

FormControl它为下面的每个定义了一个类型FormGroup

myFormGroup = new FormGroup<MyFormGroup>({
    id: new FormControl(42),
    name: new FormControl('Arthur'),
    email: new FormControl('arthur@dent.com')
});
Run Code Online (Sandbox Code Playgroud)

该值的类型FormGroup为:

Partial<{
    id: number | null;
    name: string | null;
    email: string | null;
}>
Run Code Online (Sandbox Code Playgroud)

如果我想FormGroup在函数中使用 the 的值,是否有获取该值类型的快捷方式,或者必须单独定义它,例如

interface MyFormGroupValue {
    id: number | null;
    name: string | null;
    email: string | null;
}

myFunction(myFormGroupValue: MyFormGroupValue){
    console.log(myFormGroupValue);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,是否可以MyFormGroupValue从中派生类型MyFormGroup

Tob*_* S. 8

使用映射类型infer关键字就可以解决问题。

type ExtractFormControl<T> = {
    [K in keyof T]: T[K] extends FormControl<infer U> ? U : T[K]
}

type MyFormGroupValue = ExtractFormControl<MyFormGroup>
// type MyFormGroupValue = {
//     id: number | null;
//     name: string | null;
//     email: string | null;
// }
Run Code Online (Sandbox Code Playgroud)

操场