Skip to content

dts: typeof X references in ɵmod / hostDirectives use local names with no import (TS2304 in published .d.ts) #692

Closed

Description

@Brooooooklyn

Found while reviewing #683. The member text comes from the compiler (dts.rs), so both the asset and chunk paths ship it.

ngtsc writes references to other classes in .d.ts members as typeof i1.X with import * as i1 from "./x". Oxc writes the local name with no import: format!("typeof {}", …) at dts.rs:392/406/420 (ɵmod declarations / imports / exports) and dts.rs:720/769 (hostDirectives). The name only resolves if that class happens to be declared in the same .d.ts under the same name. Declaration emit drops imports only used by decorators, so it often isn't.

A. bundled (rolldown-plugin-dts), index.ts exports only LibModule
   static ɵmod: i0.ɵɵNgModuleDeclaration<LibModule, never, [typeof InternalComponent], [typeof InternalComponent]>;
   → InternalComponent is not declared in index.d.ts → consumer tsc: TS2304 Cannot find name 'InternalComponent'

B. tsdown unbundle: true
   lib.module.d.mts: [typeof HelloComponent, typeof HighlightDirective], no import of either → 4× TS2304

C. aliased host directive: import { HighlightDirective as HD } …; hostDirectives: [{ directive: HD }]
   [{ directive: typeof HD; … }]  → no `HD` in the emitted .d.ts → TS2304 (or `any` with skipLibCheck)

With skipLibCheck: true the errors go away, but the types become any, so the consumer's Angular compiler can't see the module's exported components.

Activity

  1. added a commit that references this issue on Nov 11, 2026
    aff917b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    Priority

    None yet

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions