feat(compiler): support unary operators for more accurate type checking (#37918)
Prior to this change, the unary + and - operators would be parsed as `x - 0` and `0 - x` respectively. The runtime semantics of these expressions are equivalent, however they may introduce inaccurate template type checking errors as the literal type is lost, for example: ```ts @Component({ template: `<button [disabled]="isAdjacent(-1)"></button>` }) export class Example { isAdjacent(direction: -1 | 1): boolean { return false; } } ``` would incorrectly report a type-check error: > error TS2345: Argument of type 'number' is not assignable to parameter of type '-1 | 1'. Additionally, the translated expression for the unary + operator would be considered as arithmetic expression with an incompatible left-hand side: > error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. To resolve this issues, the implicit transformation should be avoided. This commit adds a new unary AST node to represent these expressions, allowing for more accurate type-checking. Fixes #20845 Fixes #36178 PR Close #37918
This commit is contained in:
@ -34,11 +34,11 @@ describe('parser', () => {
|
||||
checkAction('undefined');
|
||||
});
|
||||
|
||||
it('should parse unary - expressions', () => {
|
||||
checkAction('-1', '0 - 1');
|
||||
checkAction('+1', '1 - 0');
|
||||
checkAction(`-'1'`, `0 - "1"`);
|
||||
checkAction(`+'1'`, `"1" - 0`);
|
||||
it('should parse unary - and + expressions', () => {
|
||||
checkAction('-1', '-1');
|
||||
checkAction('+1', '+1');
|
||||
checkAction(`-'1'`, `-"1"`);
|
||||
checkAction(`+'1'`, `+"1"`);
|
||||
});
|
||||
|
||||
it('should parse unary ! expressions', () => {
|
||||
|
Reference in New Issue
Block a user