microsoft / microsoft/TypeScript

Autocompletion fails - unnecessarily narrow for inferred Generic

Offen
#52,726 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Domain: LS: Completion Lists Experience Enhancement Help Wanted Suggestion
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

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

image

image

image

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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit dem verlinkten TypeScript Playground-Repro und der im Issue gezeigten generischen tag-Funktion; untersuche anschließend, wie die Vervollständigung des Language Servers die Constraint des Restparameters auflöst. Fertig ist die Änderung, wenn die Vervollständigung für tag-Argumente die gültigen Role-Strings enthält und nicht nur die bereits für Evidenced inferierten Strings.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
developer-experience, tooling
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.