Type inference on tuple intersection types broken

Offen
#59,521 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Anfängerfreundlichkeit
25/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Veraltet
Tech-Stack
typescript
Bereich
compilers

Rechercherichtung

Beginne mit dem verlinkten TypeScript Playground und vergleiche die inferierten Ergebnisse für jeden bedingten Typ, der das geschnittene Tupel betrifft. Verfolge, wie Tupel-Schnittmengentypen während der Inferenz bedingter Typen behandelt werden, insbesondere bei Kopf- und Endmustern. Als abgeschlossen gilt die Aufgabe, wenn die aufgeführten Inferenzfälle die erwarteten Tupel-Elemente liefern, ohne bestehendes Verhalten zu beeinträchtigen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Domain: check: Type Inference Help Wanted Possible Improvement
🔎 Search Terms

infer tuple intersection

🕗 Version & Regression Information
  • Version 5.5.4
⏯ Playground Link

https://www.typescriptlang.org/play/?#code/C4TwDgpgBAKghgJwOYWFAvFA2gOwK4C2ARhAgDRQDOwCAljkhUQPbMA2EcOAulAGRQA3lDjBgALio16SANxQAvrICwAKDWhIUAIIYoAJU4ATZjjYgAPPGSoAfPID0DqAHdalABYAzPGyjAPegBrGTUNcGgACWMARj1rFDQIAA9gCBwjSmx6L1IoSIoAOmKcvPhaNl4AfnyoSRwIADdSR2cTCEocAHI0F2YEIPCtaLgjACZ4xESoFLSMrKxShHyi4q4QLG5q2vqmlqgnV36gyjDVTWhytjjMBNQZ1PTM7Jxc5YKoYsKl2DgK7audSgDWaCFaUHanR6RwGQ0ufzYE1uU3usyeC3Wq2+rzKCIBCKBIP2h0h3V6xzOFwMewQlAgIyMN1+NiSj3m2C+P30VwoXMi230kUJNPBpOhfVh5wi1NBdIZSOZ0zR7KwX3Wm15OOWgoFQt2oNFzA6ZJhg3UUq0hllECuTLurLmz1VJS1Bh5UD5AsB+uJbSNUPJkqpVtIdKuCvtD0dC05ru5CIo6y9BJ9YIOfuN4opqiAA

💻 Code
type Target = [number, string, boolean] & { att: string; };

type A = Readonly<Target>; // wishful thinking

type Head1 = Target extends [infer H, ...infer Tail] ? H : never; // doesn't work
type Head2 = Target extends [infer H, ...any[]] ? H : never; // works

type Tail1 = Target extends [infer H, ...infer Tail] ? Tail : never; // doesn't work
type Tail2 = Target extends [any, ...infer Tail] ? Tail : never; // doesn't work

type ReverseHead1 = Target extends [...infer RTail, infer RH] ? RH : never; // doesn't work
type ReverseHead2 = Target extends [...any[], infer RH] ? RH : never; // doesn't work

type ReverseTail1 = Target extends [...infer RTail, infer RH] ? RTail : never; // doesn't work
type ReverseTail2 = Target extends [...infer RTail, any] ? RTail : never; // doesn't work
🙁 Actual behavior

Doesn't work

🙂 Expected behavior

Works

Additional information about the issue

I would expect Readonly<[number, string, boolean] & { att: string }> to be readonly [number, string, boolean] & { readonly att: string }, but that's wishful thinking. I'm sure you guys got a myriad of reasons and design limitations that don't allow it; weak types, homomorphic, variance, instantiation and whatnot.

In any case, I thought, whatever, I'll do it myself with some infers... but it looks like I won't be able to do the general case because infers break on tuple types that are intersected.

So, just letting you know in case you care... here are some unexpected behaviors ✌️

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus microsoft/TypeScript

Alle Issues in microsoft/TypeScript

Ähnliche Issues

Weitere Issues zu Go

Neue Issues direkt in Ihr Postfach

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