Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
wizardnet972 opened this issue Mar 25, 2025 · 1 comment
Labels
Awaiting More Feedback This means we'd like to hear from more people who would be helped by this feature Suggestion An idea for TypeScript

Comments

@wizardnet972
Copy link

wizardnet972 commented Mar 25, 2025

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)

@MartinJohns
Copy link
Contributor

Related: #37878

@RyanCavanaugh RyanCavanaugh added Suggestion An idea for TypeScript Awaiting More Feedback This means we'd like to hear from more people who would be helped by this feature labels Mar 26, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Awaiting More Feedback This means we'd like to hear from more people who would be helped by this feature Suggestion An idea for TypeScript
Projects
None yet
Development

No branches or pull requests

3 participants