From 6df098f76c19bba880fb42c670ecd949a74968be Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 31 Oct 2025 13:59:04 +0100 Subject: [PATCH] refactor(core): add utility type for extracting the value of a custom control MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the `ɵExtractFormControlValue` type that we can use during template type checking to extract the type of a custom control. (cherry picked from commit 4b68bddd623af25780421a601c167c7c37687a31) --- packages/compiler/src/render3/r3_identifiers.ts | 1 + packages/core/src/core_render3_private_export.ts | 1 + packages/core/src/render3/index.ts | 1 + packages/core/src/render3/instructions/control.ts | 12 ++++++++++++ packages/core/test/render3/jit_environment_spec.ts | 1 + 5 files changed, 16 insertions(+) diff --git a/packages/compiler/src/render3/r3_identifiers.ts b/packages/compiler/src/render3/r3_identifiers.ts index d6f22858bc1..31c9df5336a 100644 --- a/packages/compiler/src/render3/r3_identifiers.ts +++ b/packages/compiler/src/render3/r3_identifiers.ts @@ -494,6 +494,7 @@ export class Identifiers { // type-checking static InputSignalBrandWriteType = {name: 'ɵINPUT_SIGNAL_BRAND_WRITE_TYPE', moduleName: CORE}; static UnwrapDirectiveSignalInputs = {name: 'ɵUnwrapDirectiveSignalInputs', moduleName: CORE}; + static ExtractFormControlValue = {name: 'ɵExtractFormControlValue', moduleName: CORE}; static unwrapWritableSignal = {name: 'ɵunwrapWritableSignal', moduleName: CORE}; static assertType = {name: 'ɵassertType', moduleName: CORE}; } diff --git a/packages/core/src/core_render3_private_export.ts b/packages/core/src/core_render3_private_export.ts index 8e546048e6e..5589f1487cb 100644 --- a/packages/core/src/core_render3_private_export.ts +++ b/packages/core/src/core_render3_private_export.ts @@ -95,6 +95,7 @@ export { ɵɵcontentQuerySignal, ɵɵcontrol, ɵɵcontrolCreate, + ɵExtractFormControlValue, ɵɵcomponentInstance, ɵɵCopyDefinitionFeature, ɵɵdefineComponent, diff --git a/packages/core/src/render3/index.ts b/packages/core/src/render3/index.ts index 4d053b02641..24074014464 100644 --- a/packages/core/src/render3/index.ts +++ b/packages/core/src/render3/index.ts @@ -97,6 +97,7 @@ export { ɵɵproperty, ɵɵcontrol, ɵɵcontrolCreate, + ɵExtractFormControlValue, ɵɵcontentQuery, ɵɵcontentQuerySignal, ɵɵloadQuery, diff --git a/packages/core/src/render3/instructions/control.ts b/packages/core/src/render3/instructions/control.ts index 09352f172fa..d9c04345c7b 100644 --- a/packages/core/src/render3/instructions/control.ts +++ b/packages/core/src/render3/instructions/control.ts @@ -32,6 +32,18 @@ import {listenToOutput} from '../view/directive_outputs'; import {listenToDomEvent, wrapListener} from '../view/listeners'; import {setPropertyAndInputs, storePropertyBindingMetadata} from './shared'; import {writeToDirectiveInput} from './write_to_directive_input'; +import {ModelSignal} from '../../authoring/model/model_signal'; + +/** + * Used during template type checking to extract the type of a custom form control. + * + * @codeGenApi + */ +export type ɵExtractFormControlValue = T extends {value: ModelSignal} + ? V + : T extends {checked: ModelSignal} + ? boolean + : unknown; /** * Possibly sets up a {@link ɵControl} to manage a native or custom form control. diff --git a/packages/core/test/render3/jit_environment_spec.ts b/packages/core/test/render3/jit_environment_spec.ts index 1184eaa4920..8e5d435b9da 100644 --- a/packages/core/test/render3/jit_environment_spec.ts +++ b/packages/core/test/render3/jit_environment_spec.ts @@ -38,6 +38,7 @@ const AOT_ONLY = new Set([ // used in type-checking. 'ɵINPUT_SIGNAL_BRAND_WRITE_TYPE', + 'ɵExtractFormControlValue', 'ɵUnwrapDirectiveSignalInputs', 'ɵunwrapWritableSignal', 'ɵassertType',