microsoft / microsoft/TypeScript
3.4.1 regression in distributed types
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.4k
- Merge moyen
- 1 j 19 h
- PR mergées (30 j)
- 117
Description
TypeScript Version: 3.5.0-dev.20190425
The example below was taken from a real world use-case and simplified.
The U type is distributed while the T type remains the original union.
The T type is wrapped with Box<T> when U is not an object.
type Box<T> = { value: T }
type Test<T> = [T] extends [infer U]
? U extends object
? U
: U | Box<T>
: never
type A = number | { foo: number }
type B = Test<A>
In theory, the B type should be identical to:
type B = number | { foo: number } | Box<number | { foo: number }>
But in the latest version, the B type is instead identical to:
type B = number | { foo: number } | Box<number | (number & { foo: number })>
This works correctly in 3.3.x but not 3.4.x and later.
Playground Link: click here
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par la reproduction liée dans Playground et comparez son comportement entre TypeScript 3.3.x et 3.4.x ou une version ultérieure. Suivez la manière dont le type conditionnel distribue U tout en préservant T, et considérez l’issue comme terminée lorsque B correspond à l’union attendue indiquée sans l’intersection dans Box.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- typescript
- Domaine
- compilers
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Clairement spécifiée
- Accessibilité débutants
- 35/100