diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/checker.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/checker.ts index 7b28868cb6a3..c61bda38d4bd 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/checker.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/checker.ts @@ -719,6 +719,11 @@ export class TemplateTypeCheckerImpl implements TemplateTypeChecker { } const emitted = emittedRef.expression; if (emitted instanceof WrappedNodeExpr) { + if (refTo.node === inContext) { + // Suppress self-imports since components do not have to import themselves. + return null; + } + let isForwardReference = false; if (emitted.node.getStart() > inContext.getStart()) { const declaration = this.programDriver.getProgram() diff --git a/packages/core/schematics/test/standalone_migration_spec.ts b/packages/core/schematics/test/standalone_migration_spec.ts index 5f496b23bfd4..78fcd1e868a8 100644 --- a/packages/core/schematics/test/standalone_migration_spec.ts +++ b/packages/core/schematics/test/standalone_migration_spec.ts @@ -1550,6 +1550,39 @@ describe('standalone migration', () => { `)); }); + it('should not generate a forwardRef for a self import', async () => { + writeFile('decls.ts', ` + import {Component} from '@angular/core'; + + @Component({ + selector: 'comp', + template: '' + }) + export class MyComp {} + `); + + writeFile('module.ts', ` + import {NgModule} from '@angular/core'; + import {MyComp} from './decls'; + + @NgModule({declarations: [MyComp]}) + export class Mod {} + `); + + await runMigration('convert-to-standalone'); + + expect(stripWhitespace(tree.readContent('decls.ts'))).toEqual(stripWhitespace(` + import {Component} from '@angular/core'; + + @Component({ + selector: 'comp', + template: '', + standalone: true + }) + export class MyComp {} + `)); + }); + it('should not generate a forwardRef when adding an imported module dependency', async () => { writeFile('./comp.ts', ` import {Component, NgModule} from '@angular/core';