microsoft / microsoft/TypeScript
`InstanceType` and constructor return type inference doesn’t work for built‑in subtypes of `ErrorConstructor`
Offen
Dieses Issue hat noch niemand übernommen.
Domain: lib.d.ts
Help Wanted
Possible Improvement
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.3k
- Ø Merge
- 2 T. 4 Std.
- Gemergte PRs (30 T.)
- 132
Beschreibung
🔎 Search Terms
- "ErrorConstructor"
- "InstanceType Error"
- "InstanceType ErrorConstructor"
🕗 Version & Regression Information
- This is the behaviour in every version I tried, and I reviewed the FAQ for entries about this.
- I was unable to test this on prior versions because
dtslintonly tests back to TypeScript 5.0, and the bug workbench failed to download versions older than TypeScript 4.0.
⏯ Playground Link
💻 Code
declare class CustomError extends Error {
}
type NE1 = InstanceType<EvalErrorConstructor>;
// ^?
type NE2 = InstanceType<RangeErrorConstructor>;
// ^?
type NE3 = InstanceType<ReferenceErrorConstructor>;
// ^?
type NE4 = InstanceType<SyntaxErrorConstructor>;
// ^?
type NE5 = InstanceType<TypeErrorConstructor>;
// ^?
type NE6 = InstanceType<URIErrorConstructor>;
// ^?
type CE = InstanceType<typeof CustomError>;
// ^?
🙁 Actual behavior
Type query results:
type NE1 = Error
type NE2 = Error
type NE3 = Error
type NE4 = Error
type NE5 = Error
type NE6 = Error
type CE = CustomError
🙂 Expected behavior
Type query results:
type NE1 = EvalError
type NE2 = RangeError
type NE3 = ReferenceError
type NE4 = SyntaxError
type NE5 = TypeError
type NE6 = URIError
type CE = CustomError
Additional information about the issue
Same happens with:
declare function newError<E extends Error>(ctor: new (msg?: string) => E): E;
declare class CustomError extends Error {
}
let ne1 = newError(EvalError);
// ^?
let ne2 = newError(RangeError);
// ^?
let ne3 = newError(ReferenceError);
// ^?
let ne4 = newError(SyntaxError);
// ^?
let ne5 = newError(TypeError);
// ^?
let ne6 = newError(URIError);
// ^?
let ce = newError(CustomError);
// ^?
Related issues
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 dem verlinkten Playground-Repro und untersuche, wie die integrierten ErrorConstructor-Typen mit InstanceType und der generischen newError-Deklaration interagieren. Vergleiche die inferierten Typen mit den erwarteten Ergebnissen für EvalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError und CustomError; als erledigt gilt die Aufgabe, wenn die Typabfragen und Konstruktoraufrufe jeden spezifischen Subtyp bewahren.
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
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100