From 18b6f3339f46b37ee67fce2fa8a900cc73b2f23c Mon Sep 17 00:00:00 2001 From: emmanuelroux <1926413+EmmanuelRoux@users.noreply.github.com> Date: Sat, 17 Jun 2023 20:24:58 +0200 Subject: [PATCH] fix(forms): fix FormRecord type inference (#50750) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updates type inference in `ɵElement` to make `FormRecord` take precedence over `FormGroup` PR Close #50750 --- packages/forms/src/form_builder.ts | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/forms/src/form_builder.ts b/packages/forms/src/form_builder.ts index ef64b6d9edf..7721deb332e 100644 --- a/packages/forms/src/form_builder.ts +++ b/packages/forms/src/form_builder.ts @@ -75,24 +75,28 @@ export type ɵElement = // through the distributive conditional type. This is the officially recommended solution: // https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types // + // Note: Because `FormRecord` implementation extends `FormGroup`, it must be checked BEFORE `FormGroup` + // in the following clauses (otherwise it may incorrectly be inferred to `FormGroup`). + // + // // Identify FormControl container types. [T] extends [FormControl] ? FormControl : // Or FormControl containers that are optional in their parent group. [T] extends [FormControl | undefined] ? FormControl - : // FormGroup containers. - [T] extends [FormGroup] - ? FormGroup - : // Optional FormGroup containers. - [T] extends [FormGroup | undefined] - ? FormGroup - : // FormRecord containers. - [T] extends [FormRecord] - ? FormRecord - : // Optional FormRecord containers. - [T] extends [FormRecord | undefined] - ? FormRecord + : // FormRecord containers. + [T] extends [FormRecord] + ? FormRecord + : // Optional FormRecord containers. + [T] extends [FormRecord | undefined] + ? FormRecord + : // FormGroup containers. + [T] extends [FormGroup] + ? FormGroup + : // Optional FormGroup containers. + [T] extends [FormGroup | undefined] + ? FormGroup : // FormArray containers. [T] extends [FormArray] ? FormArray