microsoft / microsoft/TypeScript

`InstanceType` and constructor return type inference doesn’t work for built‑in subtypes of `ErrorConstructor`

Offen
#61,460 4 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

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 dtslint only tests back to TypeScript 5.0, and the bug workbench failed to download versions older than TypeScript 4.0.
⏯ Playground Link

https://www.typescriptlang.org/dev/bug-workbench/?#code/CYUwxgNghgTiAEkoGdnwMIFdkBcD2AtgKIwx4zwgAeOIAdsGiWRQN4BQAvu+zgJ4AHBADkiARngBeeAEk6uKHTAgAKoJAAeIgDcoEZuXR55OGJjD4YAPgDc7APT34z+AD0A-D35D4ogExSsiaKympCGgBKigDmIAYwRiZmFuS2Dk4uHl7qvkQAzIFyCkqq6pEgAGYgcCXxibjJlmmOLm6evDmiACyFwSVhmgDKfHQ4UFR1xg3mTXYtme3eIkQArL3FoWUDk0kzqXMZzlkdPqIAbOtj-WUAqhEyO9Mp1getx0sYRJchpeFLeBUMNh8MRSPt0m9PEA

💻 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>;
//    ^?

Workbench Repro

🙁 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);
//   ^?

Workbench Repro

Related issues

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 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

Neue Issues direkt in Ihr Postfach

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