microsoft / microsoft/TypeScript
Generic inference of Overloaded methods only working with the last defined method
Offen
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
🙁 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
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Ö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