microsoft / microsoft/TypeScript
Narrowed generic type is ignored in return type of callback passed to generic function
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.3k
- Ø Merge
- 1 T. 19 Std.
- Gemergte PRs (30 T.)
- 117
Beschreibung
Bug Report
See the code below. When returning a value with a narrowed generic type, the callback can't be assigned to a parameter whose return type is the same as the narrowed type. The error only happens when the callback is passed to a generic function (even when the generic isn't used for anything).
🔎 Search Terms
generic narrow callback return type
🕗 Version & Regression Information
I tried a bunch of versions in the playground, they all have the bug
⏯ Playground Link
Playground link with relevant code
💻 Code
type Union = number | string;
type Root = Record<string, Union>;
function noBug(cb: () => number) {}
function bug<T>(cb: () => number) {}
function foo<T extends Root>(root: T, key: keyof T) {
const union = root[key];
// ^?
noBug(() => {
// ^?
if (typeof union === "string") throw new Error();
return union;
// ^?
});
bug(() => {
// ^?
if (typeof union === "string") throw new Error();
return union;
// ^?
});
}
🙁 Actual behavior
The call to bug results in this error: Argument of type '() => T[keyof T]' is not assignable to parameter of type '() => number'.
🙂 Expected behavior
The call to bug should have no errors, like the call to noBug.
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 mit der verlinkten TypeScript Playground-Reproduktion und vergleiche die Prüfung des Rückgabetyps des Callbacks in der nicht generischen Funktion noBug mit der generischen Funktion bug. Verfolge den Pfad der Prüfung generischer Callbacks und verifiziere, dass der eingeengte Wert in bug als number akzeptiert wird; behalte die Abdeckung für dieses Beispiel bei.
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