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:
- importera typen uttryckligen
- 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
