microsoft / microsoft/TypeScript

Create subtype reduction rules for assertion functions

Offen
#53,963 4 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

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

Beschreibung

Bug Report

🔎 Search Terms

inference assert

🕗 Version & Regression Information
⏯ Playground Link

Playground link with relevant code

💻 Code
function Test<X extends any>(params: X[]) {}
function Test2<InParams extends readonly any[]>(params: InParams) {}

function f1(a: any): number {return 1}
function f2(a: any): string {return "string"}
function f3(a: any) {return {k: 1}}

function a1(a: any): asserts a is number {}
function a2(a: any): asserts a is string {}
function a3(a: any): asserts a is {k: number} {}

const aifwe = [f1, f2, f3]
Test([f1, f2, f3])
Test([a1, a2, a3])
Test2([f1, f2, f3])
Test2([a1, a2, a3])
🙁 Actual behavior

The Test and Test2 calls are inferred as (in order):

  • function Test<((a: any) => number) | ((a: any) => string) | ((a: any) => { k: number; })>(params: (((a: any) => number) | ((a: any) => string) | ((a: any) => { k: number; }))[]): void
  • function Test<(a: any) => asserts a is number>(params: ((a: any) => asserts a is number)[]): void
  • function Test2<(((a: any) => number) | ((a: any) => string) | ((a: any) => { k: number; }))[]>(params: (((a: any) => number) | ((a: any) => string) | ((a: any) => { k: number; }))[]): void
  • function Test2<((a: any) => asserts a is number)[]>(params: ((a: any) => asserts a is number)[]): void
🙂 Expected behavior

For the assert calls to also be inferred as unions.

This is also irregular since with the wrong inference, I would expect the other functions to be marked as errors, since they have different type signatures.

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 verknüpften TypeScript Playground-Beispiel und verfolge die generische Inferenz für Arrays von Assertion-Funktionen, wobei der Fokus auf den angeforderten Regeln zur Subtyp-Reduktion liegt. Die Aufgabe ist abgeschlossen, wenn die Assertion-Aufrufe von Test und Test2 wie die Aufrufe gewöhnlicher Funktionen Vereinigungen inferieren und das relevante Inferenzverhalten durch einen Regressionstest abgedeckt ist.

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.