Skip to content

Commit e843003

Browse files
cexbrayatatscott
authored andcommitted
fix(compiler-cli): bind switch exhaustive check expressions
Ensure switch exhaustive check parameters are visited during template binding so local template symbols are resolved correctly. This allows: ```html @let state = this.state(); @switch (state.mode) { @case ('show') { {{ state.menu }}; } @case ('hide') {} @default never(state); } ```
1 parent 636cc94 commit e843003

2 files changed

Lines changed: 22 additions & 0 deletions

File tree

packages/compiler-cli/src/ngtsc/typecheck/test/diagnostics_spec.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1487,6 +1487,27 @@ class TestComponent {
14871487

14881488
expect(messages).toEqual([]);
14891489
});
1490+
1491+
it('should narrow a let declaration with the same name as a component property', () => {
1492+
const messages = diagnose(
1493+
`
1494+
@let state = this.state();
1495+
@switch (state.mode) {
1496+
@case ('show') { {{ state.menu }}; }
1497+
@case ('hide') {}
1498+
@default never(state);
1499+
}
1500+
`,
1501+
`
1502+
import {InputSignal} from '@angular/core';
1503+
export class TestComponent {
1504+
state: InputSignal<{ mode: 'hide' } | { mode: 'show'; menu: number }>;
1505+
}
1506+
`,
1507+
);
1508+
1509+
expect(messages).toEqual([]);
1510+
});
14901511
});
14911512

14921513
// https://github.com/angular/angular/issues/43970

packages/compiler/src/combined_visitor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ export class CombinedRecursiveAstVisitor extends RecursiveAstVisitor implements
9090
visitSwitchBlock(block: t.SwitchBlock): void {
9191
this.visit(block.expression);
9292
this.visitAllTemplateNodes(block.groups);
93+
block.exhaustiveCheck?.visit(this);
9394
}
9495

9596
visitSwitchBlockCase(block: t.SwitchBlockCase): void {

0 commit comments

Comments
 (0)