{"record":{"id":"5675fa0ace23fd7a","repo":"angular/angular","slug":"the-templatetypechecker-does-not-work-without-e","errorCode":null,"errorMessage":"The `TemplateTypeChecker` does not work without `enableTemplateTypeChecker`.","messagePattern":"The `TemplateTypeChecker` does not work without `enableTemplateTypeChecker`\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/compiler-cli/src/ngtsc/core/src/compiler.ts","lineNumber":727,"sourceCode":"   * Compilation begins with an input `ts.Program`, and during template type-checking operations new\n   * `ts.Program`s may be produced using the `ProgramDriver`. The most recent such `ts.Program` to\n   * be produced is available here.\n   *\n   * This `ts.Program` serves two key purposes:\n   *\n   * * As an incremental starting point for creating the next `ts.Program` based on files that the\n   *   user has changed (for clients using the TS compiler program APIs).\n   *\n   * * As the \"before\" point for an incremental compilation invocation, to determine what's changed\n   *   between the old and new programs (for all compilations).\n   */\n  getCurrentProgram(): ts.Program {\n    return this.currentProgram;\n  }\n\n  getTemplateTypeChecker(): TemplateTypeChecker {\n    if (!this.enableTemplateTypeChecker) {\n      throw new Error(\n        'The `TemplateTypeChecker` does not work without `enableTemplateTypeChecker`.',\n      );\n    }\n    return this.ensureAnalyzed().templateTypeChecker;\n  }\n\n  /**\n   * Retrieves the `ts.Declaration`s for any component(s) which use the given template file.\n   */\n  getComponentsWithTemplateFile(templateFilePath: string): ReadonlySet<DeclarationNode> {\n    const {resourceRegistry} = this.ensureAnalyzed();\n    return resourceRegistry.getComponentsWithTemplate(resolve(templateFilePath));\n  }\n\n  /**\n   * Retrieves the `ts.Declaration`s for any component(s) which use the given template file.\n   */\n  getComponentsWithStyleFile(styleFilePath: string): ReadonlySet<DeclarationNode> {","sourceCodeStart":709,"sourceCodeEnd":745,"githubUrl":"https://github.com/angular/angular/blob/51cb07e98081ab7e4e84a9e0949266a8e19cca84/packages/compiler-cli/src/ngtsc/core/src/compiler.ts#L709-L745","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["Pass enableTemplateTypeChecker: true in the Angular compiler options when constructing the program","For tsconfig-driven tooling, add \"enableTemplateTypeChecker\": true under angularCompilerOptions","If template type info is not actually needed, use other NgtscProgram APIs (getTsProgram, getSemanticDiagnostics) that do not require the flag"],"exampleFix":"// before\nconst program = new NgtscProgram(rootNames, {noCheck: true}, host);\nprogram.getTemplateTypeChecker(); // throws\n\n// after\nconst program = new NgtscProgram(\n  rootNames,\n  {angularCompilerOptions: {enableTemplateTypeChecker: true}},\n  host,\n);\nprogram.getTemplateTypeChecker(); // ok","handlingStrategy":"validation","validationCode":"import type {NgtscProgram} from '@angular/compiler-cli';\n\n// Check the flag before touching the accessor\nfunction assertTemplateTypeCheckerAvailable(\n  program: NgtscProgram,\n): asserts program is NgtscProgram {\n  const opts = program.getTsProgram().getCompilerOptions() as any;\n  if (!opts?.angularCompilerOptions?.enableTemplateTypeChecker) {\n    throw new Error(\n      'enableTemplateTypeChecker is off: pass it in Angular compiler options before calling getTemplateTypeChecker()',\n    );\n  }\n}","typeGuard":"function hasTemplateTypeCheckerEnabled(opts: {enableTemplateTypeChecker?: boolean}): boolean {\n  return opts.enableTemplateTypeChecker === true;\n}","tryCatchPattern":"try {\n  const ttc = program.getTemplateTypeChecker();\n} catch (e) {\n  if (e instanceof Error && e.message.includes('enableTemplateTypeChecker')) {\n    // recreate the program with the option enabled, or fall back to non-template APIs\n  }\n  throw e;\n}","preventionTips":["Centralize program creation in tooling so enableTemplateTypeChecker is always set for analysis builds","Remember extendedTemplateTypeChecker requires the base enableTemplateTypeChecker flag","Never assume a build-created program exposes template checking APIs"],"tags":["angular","compiler-cli","template-type-checker","options","programmatic-api"],"backgroundTag":"missing-compiler-option","analyzedSha":"51cb07e98081ab7e4e84a9e0949266a8e19cca84","analyzedAt":"2026-08-22T07:04:54.531Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}