typescript - Exporterad variabel X har eller använder namnet Y från extern modul Z men kan inte namnges


Jag får följande fel i detta fall när jag använder TS 3.9 med { compilerOptions: {declaration: true }} i min tsconfig.json:

// a.ts
export const key = 1234
export const obj = {
    [key]: 1
};
export default obj;

// b.ts
import A from "./a";
import { key} from "./a"

// Exported variable 'theExport' has or is using name 'key' from external module "c:/tsexample/src/a" but cannot be named.ts(4023)
const theExport  = {
  A: A,
  B: 2,
  C: 3,
};
export default theExport
// Exported variable 'theExport' has or is using name 'key' from external module "c:/tsexample/src/a" but cannot be named.ts(4023)

I en kommentar om ett relaterat problem föreslog dåvarande PM för TS två lösningar:

  1. importera typen uttryckligen
  2. deklarera tydligt typen av exporten (där felet uppstår)

(1) fungerar inte i det här fallet. Jag försökte exportera allt från 'a' och importera allt i 'b' och det blev ingen skillnad i felmeddelandet.

Det enda som fungerade var denna mycket utdragna och svårunderhållna explicita typanteckning:

// updated b.ts
import A from "./a";

const theExport: {
    // https://github.com/microsoft/TypeScript/issues/9944
  [index: string]: typeof A | number;
} = {
  A: A,
  B: 2,
  C: 3,
};
export default theExport;

Min fråga är:

  • vilken lösning kan jag använda som inte innebär att upprepa objektets form?
  • varför löser inte importeringen av typen problemet?

Denna fråga är liknande men skiljer sig från:

  • https://stackoverflow.com/a/44066867/2482570: inte relevant eftersom det står att problemet åtgärdades i TS 2.9
  • https://stackoverflow.com/a/49841010/2482570: ingen av svaren erbjuder en lösning som är tillämplig i det här fallet
  • Typescript-fel: "Return type of exported function has or is using name from external module but cannot be named" och Typing-fel "Default export of the module has or is using private name" - byte från typescript v1.8 till 2: ingen av de föreslagna lösningarna fungerar i detta fall

Svar #1

Det är inte så snyggt, men detta är en minimalt invasiv förändring som verkar fungera i en sandlåda:

const theExport = {
  A: A as {[K in keyof typeof A]: typeof A[K]},
  B: 2,
  C: 3
};

Svar #2

baserat på denna kommentar, verkar det som en lösning skulle kunna vara:

// a.ts
export const key = 1234
export const obj = {
    [key]: 1
};
export default obj;

// b.ts
import A from "./a";

interface ITheExport {
  A: typeof A;
  B: number;
  C: number;
}

const theExport: ITheExport = { // strong typing the object instead of using inference
  A: A,
  B: 2,
  C: 3,
};
export default theExport

Se sandlåda

Relaterade artiklar