feat(ivy): support $any when type-checking templates (#29698)
This commit adds support in the template type-checking engine for the $any cast operation. Testing strategy: TCB tests included. PR Close #29698
This commit is contained in:
parent
bea85ffe9c
commit
42262e4e8c
@ -6,7 +6,7 @@
|
|||||||
* found in the LICENSE file at https://angular.io/license
|
* found in the LICENSE file at https://angular.io/license
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import {AST, BindingPipe, BindingType, BoundTarget, ImplicitReceiver, PropertyRead, TmplAstBoundAttribute, TmplAstBoundText, TmplAstElement, TmplAstNode, TmplAstReference, TmplAstTemplate, TmplAstTextAttribute, TmplAstVariable} from '@angular/compiler';
|
import {AST, BindingPipe, BindingType, BoundTarget, ImplicitReceiver, MethodCall, PropertyRead, TmplAstBoundAttribute, TmplAstBoundText, TmplAstElement, TmplAstNode, TmplAstReference, TmplAstTemplate, TmplAstTextAttribute, TmplAstVariable} from '@angular/compiler';
|
||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
import {Reference} from '../../imports';
|
import {Reference} from '../../imports';
|
||||||
@ -813,6 +813,13 @@ function tcbResolve(ast: AST, tcb: Context, scope: Scope): ts.Expression|null {
|
|||||||
}
|
}
|
||||||
const args = ast.args.map(arg => tcbExpression(arg, tcb, scope));
|
const args = ast.args.map(arg => tcbExpression(arg, tcb, scope));
|
||||||
return tsCallMethod(pipe, 'transform', [expr, ...args]);
|
return tsCallMethod(pipe, 'transform', [expr, ...args]);
|
||||||
|
} else if (
|
||||||
|
ast instanceof MethodCall && ast.receiver instanceof ImplicitReceiver &&
|
||||||
|
ast.name === '$any' && ast.args.length === 1) {
|
||||||
|
const expr = tcbExpression(ast.args[0], tcb, scope);
|
||||||
|
const exprAsAny =
|
||||||
|
ts.createAsExpression(expr, ts.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword));
|
||||||
|
return ts.createParen(exprAsAny);
|
||||||
} else {
|
} else {
|
||||||
// This AST isn't special after all.
|
// This AST isn't special after all.
|
||||||
return null;
|
return null;
|
||||||
|
@ -76,6 +76,12 @@ describe('type check blocks', () => {
|
|||||||
expect(block).not.toContain('.style = ');
|
expect(block).not.toContain('.style = ');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should handle $any casts', () => {
|
||||||
|
const TEMPLATE = `{{$any(a)}}`;
|
||||||
|
const block = tcb(TEMPLATE);
|
||||||
|
expect(block).toContain('(ctx.a as any);');
|
||||||
|
});
|
||||||
|
|
||||||
describe('config', () => {
|
describe('config', () => {
|
||||||
const DIRECTIVES: TestDeclaration[] = [{
|
const DIRECTIVES: TestDeclaration[] = [{
|
||||||
type: 'directive',
|
type: 'directive',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user