microsoft / microsoft/TypeScript

Generic inference of Overloaded methods only working with the last defined method

Offen
#43,187 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Docs
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

Bug Report

🔎 Search Terms
  • Generics
  • Overload
  • Type inference
🕗 Version & Regression Information
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about overloading
⏯ Playground Link

Playground link with relevant code

💻 Code
class SomeClazz {
    public overload(param: 'PARAM1'): number;
    public overload(param: 'PARAM2'): string;

    public overload(param: 'PARAM1' | 'PARAM2'): number | string {
        switch (param) {
            case 'PARAM1':
                return 1337;
            case 'PARAM2':
                return 'Hi';
        }
    }
}

function call<Ctx extends { [F in Name]: (this: Context, ...args: any[]) => any }, Name extends string>(
    ctx: Ctx,
    method: Name,
    ...args: Parameters<Ctx[Name]>
): void {
    ctx[method](...args);
}

const clazz = new SomeClazz();
clazz.overload('PARAM1'); // Works ok
clazz.overload('PARAM2'); // works ok
call(clazz, 'overload', 'PARAM1'); // ERROR: Argument of type '"PARAM1"' is not assignable to parameter of type '"PARAM2"'
call(clazz, 'overload', 'PARAM2'); // Works ok

Workbench Repro

🙁 Actual behavior
  • Only one function overload is taken into account when inferring function parameter types
🙂 Expected behavior
  • All function overloads should be taken into account when inferring function parameter types

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 verknüpfte Playground- oder Workbench-Repro auszuführen, und vergleiche die beiden generischen Aufrufstellen mit den direkten Overload-Aufrufen. Verfolge, wie Parameters<Ctx[Name]> für die überladene Methode inferiert wird; fertig ist die Aufgabe, wenn sowohl call(clazz, 'overload', 'PARAM1') als auch call(clazz, 'overload', 'PARAM2') akzeptiert werden und dabei das gemeldete Overload-Verhalten erhalten bleibt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

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