microsoft / microsoft/TypeScript
Autocompletion fails - unnecessarily narrow for inferred Generic
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
Bug Report
In the following example typescript IS able to judge the set of valid strings, (as shown by the compiler error), but somehow autocompletion from the language server CAN'T resolve that set. It resolves instead to the set of strings already populated, as shown below in screenshots from the typescript playground



Ideally this approach should have editor autocompletion support constraining strings to type Role, NOT type Evidenced. The type Evidenced is actually inferred from the items being edited right now so the programmer should be able to draw from the broader set Role.
🔎 Search Terms
Autocompletion, inferred, generic, constraint, "too narrow"
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about inference
⏯ Playground Link
Playground link with relevant code
💻 Code
const ROLES = ["artist", "baker", "candlestickmaker"] as const satisfies ReadonlyArray<string>;
type Role = typeof ROLES[number];
function tag<Evidenced extends Role>(
fn: (evidence: (role: Evidenced) => void) => void,
...roles: [Evidenced, ...Evidenced[]]
) {
// decorate fn
return () => {;};
}
const decoratedFn = tag(
() => {;},
"artist", "baker", "candle"
)
🙁 Actual behavior
The set of strings for autocompletion is initially empty, when it should be populated by Role. After one or more entries have been provided to the list, it then autocompletes only to strings which are already provided.
🙂 Expected behavior
The set of strings for autocompletion of the arguments to the tag function should be populated by Role
Background
The motivating example is within a portfolio of narrative content (interactive fiction-style) using Generator functions. This wrapper function defines a composition function type to evidence roles either by invoking the callback between yields (when a yielded narrative references that role), or if that hasn't happened by calling the callback for those roles when the function eventually returns (allowing very terse definitions for simple narratives without requiring inline callbacks).
This ensures that not referencing at least one role is an error, and offers the delight that narrative elements which touch on some role can lead to an immediate update of the displayed model (showing which roles have been evidenced).
The central purpose of this typing is to assist with editor support, so not being able to have autocompletion is a real dead-end.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con il repro collegato di TypeScript Playground e con la funzione generica tag mostrata nell’issue; poi esamina come il completamento del language server risolve il vincolo del parametro rest. Il lavoro è completo quando il completamento degli argomenti di tag include le stringhe Role valide, anziché solo le stringhe già inferite per Evidenced.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- typescript
- Ambito
- developer-experience, tooling
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 35/100