TS4023

Exported variable 'moduleA' has or is using name 'ClassA' from external module 'ClassA' but cannot be named.

Broken Code ❌

ClassA.ts
export default class ClassA {
  public method() {
    return true;
  }
}
ModuleB.ts
import ClassA from './ClassA';
var moduleB = {
  ClassA: ClassA,
};
export default moduleB;
ModuleA.ts
import moduleB from './ModuleB';
var moduleA = {
  moduleB: moduleB,
};
export default moduleA;

Solution:

The error occurs because the exported variable moduleA references ClassA indirectly through moduleB, and TypeScript needs to be able to name ClassA for type-checking purposes. Since ClassA is being exported as a default export, TypeScript cannot directly reference it without importing it.

To fix this, you need to explicitly import and export the ClassA type in your ModuleA.ts file. This ensures TypeScript can reference the ClassA type properly.

Fixed Code ✔️

ClassA.ts
export default class ClassA {
  public method() {
    return true;
  }
}
ModuleB.ts
import ClassA from './ClassA';
var moduleB = {
  ClassA: ClassA,
};
export default moduleB;
ModuleA.ts
import moduleB from './ModuleB';
import ClassA from './ClassA'; // Import ClassA to reference its type
 
var moduleA = {
  moduleB: moduleB,
};
 
export default moduleA;
export { ClassA }; // Export ClassA explicitly