diff --git a/packages/compiler-cli/src/ngtsc/typecheck/test/diagnostics_spec.ts b/packages/compiler-cli/src/ngtsc/typecheck/test/diagnostics_spec.ts index de794ea506c..bc7bf7b4f86 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/test/diagnostics_spec.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/test/diagnostics_spec.ts @@ -1487,6 +1487,27 @@ class TestComponent { expect(messages).toEqual([]); }); + + it('should narrow a let declaration with the same name as a component property', () => { + const messages = diagnose( + ` + @let state = this.state(); + @switch (state.mode) { + @case ('show') { {{ state.menu }}; } + @case ('hide') {} + @default never(state); + } + `, + ` + import {InputSignal} from '@angular/core'; + export class TestComponent { + state: InputSignal<{ mode: 'hide' } | { mode: 'show'; menu: number }>; + } + `, + ); + + expect(messages).toEqual([]); + }); }); // https://github.com/angular/angular/issues/43970 diff --git a/packages/compiler/src/combined_visitor.ts b/packages/compiler/src/combined_visitor.ts index e18876634e4..942dcba373c 100644 --- a/packages/compiler/src/combined_visitor.ts +++ b/packages/compiler/src/combined_visitor.ts @@ -90,6 +90,7 @@ export class CombinedRecursiveAstVisitor extends RecursiveAstVisitor implements visitSwitchBlock(block: t.SwitchBlock): void { this.visit(block.expression); this.visitAllTemplateNodes(block.groups); + block.exhaustiveCheck?.visit(this); } visitSwitchBlockCase(block: t.SwitchBlockCase): void {