microsoft / microsoft/TypeScript

"Find All References" shows all interface implementations instead of specific class method references

Offen
#61,484 1 Kommentar 2 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Awaiting More Feedback Suggestion
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

When using VS Code's "Find All References" on a class method that implements an interface method, the results include all instances where the method is defined (e.g., in the interface and other implementing classes). However, I expected it to show only references specific to the selected class implementation.

Steps to Reproduce:
  1. Create a TypeScript file with the following code:
    export declare interface Transform {
      transform(value: any, ...args: any[]): any;
    }
    
    export class Bar implements Transform {
      transform() {}
    }
    
    export class Baz implements Transform {
      transform() {}
    }
    
  2. Right-click on the transform method inside the Bar class.
  3. Select "Find All References" from the context menu.
  4. The results include all occurrences of transform, including the interface definition and the implementation in Baz.
Expected Behavior:

VS Code should return only the references specific to Bar's implementation of transform.

Actual Behavior:

The search includes all references to transform across the interface and other implementations, making it difficult to isolate usages of Bar.transform.


Impact on "inferFromUsage"

The behavior also affects TypeScript's "inferFromUsage" feature:

export declare interface Transform {
    transform(value: any, ...args: any[]): any;
}

export class Bar implements Transform {
    transform(value) { }  // <-- Inferred: value is a number
}

export class Baz implements Transform {
    transform(value) { }  // <-- Also inferred as a number, even though Baz is unused
}

new Bar().transform(1);

Since Bar.transform(1) is explicitly called, TypeScript infers value as a number. However, Baz.transform also gets the same inferred type even though it's never used. This suggests that TypeScript applies inference across all implementations of the interface, rather than treating them independently.

[🔗 TypeScript AST Viewer](https://ts-ast-viewer.com/#code/KYDwDg9gTgLgBAE2AYwDYEMrDgSwHYzBQBm6y2AKlOngM7HQC2cA3gFBydwzV0NSMAFADd0qAK7AAXHBoBPADRwAdKswBzWjPkBtALoBKbXjkBuNgF82bUJFhw06WrTgAhTLkZhUwRsAIuVDT0TKwcXDzB-EKiEsAGrHBWVjbg0PCOzm7oAF6e3r7+MIG8IQJhXNyl0SJikgksSZbWeMAA7tlQggbKkXxMggCMBuZAA)

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 damit, das TypeScript-Beispiel mit „Find All References“ und dem im Issue beschriebenen Fall inferFromUsage zu reproduzieren. Verfolge, wie Implementierungen von Interfaces während der Referenzsuche und der Usage-Inferenz zugeordnet werden, und füge anschließend eine gezielte Abdeckung hinzu, die zeigt, dass Bar.transform und Baz.transform unabhängig voneinander behandelt werden; abgeschlossen ist die Aufgabe, wenn die Ergebnisse und die inferierten Typen dem erwarteten Verhalten entsprechen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
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.