microsoft / microsoft/TypeScript
error TS4058: Return type of exported function has or is using name '$SYM' from external module fileA but cannot be named
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 111k
- Forks
- 14.3k
- Avg merge
- 1d 19h
- Merged PRs (30d)
- 117
Description
Bug Report
🔎 Search Terms
cannot be named symbol
TS4058
🕗 Version & Regression Information
- This changed between versions 4.7.4 and 5.2.0-dev.20230710
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about "cannot be named"
⏯ Playground Link
Two files involved, so can't make a playground link
💻 Code
declaration=true
// fileA.ts
export const $SYM = Symbol("$SYM");
export const OBJ = { [$SYM]: 42 };
// fileB.ts
import type { $SYM, OBJ } from "./fileA";
export function func(obj: typeof OBJ, sym: typeof $SYM) {
return [obj, sym];
}
🙁 Actual behavior
Error: Return type of exported function has or is using name '$SYM' from external module "fileA" but cannot be named.
🙂 Expected behavior
The expectation was that it compiles. Because if I use a string constant literal instead of the symbol, it works.
P.S.
In version 4.7.4 it worked, BUT it worked incorrectly: it generated declarations like function func(obj: { [$SYM]: number }) without actually importing $SYM, so it treated $SYM as a string (I think it was a bug). Now that bug is fixed, but there is still no way to generate declarations for similar situations (and as you can see, importing $SYM explicitly doesn't help).
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the two-file repro in fileA.ts and fileB.ts, using declaration=true and the TypeScript versions described in the report. Trace declaration generation for the exported func return type and the imported symbol. Done means the repro compiles and emits declarations that correctly preserve the symbol reference without TS4058.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- compilers
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100