angular/angular · error · Error

The `TemplateTypeChecker` does not work without `enableTempl

Error message

The `TemplateTypeChecker` does not work without `enableTemplateTypeChecker`.

What it means

NgtscProgram.getTemplateTypeChecker() exposes the TemplateTypeChecker that powers template type-checking and tooling such as the Angular language service. The program must have been created with the enableTemplateTypeChecker option; otherwise the accessor throws a plain Error. The flag enables the analysis passes the template checker depends on, so there is no way to obtain it from a program built without that setting.

Source

Thrown at packages/compiler-cli/src/ngtsc/core/src/compiler.ts:727

   * Compilation begins with an input `ts.Program`, and during template type-checking operations new
   * `ts.Program`s may be produced using the `ProgramDriver`. The most recent such `ts.Program` to
   * be produced is available here.
   *
   * This `ts.Program` serves two key purposes:
   *
   * * As an incremental starting point for creating the next `ts.Program` based on files that the
   *   user has changed (for clients using the TS compiler program APIs).
   *
   * * As the "before" point for an incremental compilation invocation, to determine what's changed
   *   between the old and new programs (for all compilations).
   */
  getCurrentProgram(): ts.Program {
    return this.currentProgram;
  }

  getTemplateTypeChecker(): TemplateTypeChecker {
    if (!this.enableTemplateTypeChecker) {
      throw new Error(
        'The `TemplateTypeChecker` does not work without `enableTemplateTypeChecker`.',
      );
    }
    return this.ensureAnalyzed().templateTypeChecker;
  }

  /**
   * Retrieves the `ts.Declaration`s for any component(s) which use the given template file.
   */
  getComponentsWithTemplateFile(templateFilePath: string): ReadonlySet<DeclarationNode> {
    const {resourceRegistry} = this.ensureAnalyzed();
    return resourceRegistry.getComponentsWithTemplate(resolve(templateFilePath));
  }

  /**
   * Retrieves the `ts.Declaration`s for any component(s) which use the given template file.
   */
  getComponentsWithStyleFile(styleFilePath: string): ReadonlySet<DeclarationNode> {

View on GitHub (pinned to 51cb07e980)

Solutions

  1. Pass enableTemplateTypeChecker: true in the Angular compiler options when constructing the program
  2. For tsconfig-driven tooling, add "enableTemplateTypeChecker": true under angularCompilerOptions
  3. If template type info is not actually needed, use other NgtscProgram APIs (getTsProgram, getSemanticDiagnostics) that do not require the flag

Example fix

// before
const program = new NgtscProgram(rootNames, {noCheck: true}, host);
program.getTemplateTypeChecker(); // throws

// after
const program = new NgtscProgram(
  rootNames,
  {angularCompilerOptions: {enableTemplateTypeChecker: true}},
  host,
);
program.getTemplateTypeChecker(); // ok
Defensive patterns

Strategy: validation

Validate before calling

import type {NgtscProgram} from '@angular/compiler-cli';

// Check the flag before touching the accessor
function assertTemplateTypeCheckerAvailable(
  program: NgtscProgram,
): asserts program is NgtscProgram {
  const opts = program.getTsProgram().getCompilerOptions() as any;
  if (!opts?.angularCompilerOptions?.enableTemplateTypeChecker) {
    throw new Error(
      'enableTemplateTypeChecker is off: pass it in Angular compiler options before calling getTemplateTypeChecker()',
    );
  }
}

Type guard

function hasTemplateTypeCheckerEnabled(opts: {enableTemplateTypeChecker?: boolean}): boolean {
  return opts.enableTemplateTypeChecker === true;
}

Try / catch

try {
  const ttc = program.getTemplateTypeChecker();
} catch (e) {
  if (e instanceof Error && e.message.includes('enableTemplateTypeChecker')) {
    // recreate the program with the option enabled, or fall back to non-template APIs
  }
  throw e;
}

Prevention

When it happens

Trigger: Calling program.getTemplateTypeChecker() on an NgtscProgram whose options lack enableTemplateTypeChecker: true — typically a custom plugin, CLI extension, or analysis tool reusing a program created by a standard ng build (which does not enable it).

Common situations: Building editor plugins or custom checks on top of @angular/compiler-cli; reusing a build program for analysis; enabling extendedTemplateTypeChecker without its required base flag enableTemplateTypeChecker.

Related errors


AI-assisted analysis of angular/angular@51cb07e980 (2026-08-22). Data as JSON: /api/errors/5675fa0ace23fd7a. Report an issue: GitHub.