microsoft / microsoft/TypeScript
Type parameter not usable as type argument in identical type; union in constraint becomes intersection
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.3k
- Merge moyen
- 2 j 4 h
- PR mergées (30 j)
- 132
Description
🔎 Search Terms
indexed access, constraints, generic, unions, ts2344
🕗 Version & Regression Information
- This changed between versions 3.3 and 3.5 (likely #30769)
⏯ Playground Link
💻 Code
interface Foo<T extends { x: string }, U extends (T | { x: "a" })['x']> {
z: Foo<T, U> // error!
// ~ Type 'U' does not satisfy the constraint 'T["x"] & "a"'. 🙃
}
🙁 Actual behavior
The U type parameter is rejected as a type argument with a TS2344 error about how it doesn't satisfy the constraint. The constraint seems to have shifted from a union to an intersection, even though it comes from an identical place.
🙂 Expected behavior
The U type parameter should be accepted as a type argument.
Additional information about the issue
Distilled from SO question.
I expect this is a consequence of #30769 as per https://github.com/microsoft/TypeScript/issues/31731#issuecomment-498465358, but it is at least somewhat surprising that this should happen when the types involved are identical. One could rewrite the constraint to U extends T["x"] | "a", of course, but this is distilled from the above SO question which is presumably distilled from some use case. What's happening here, exactly, and is it intended, a design limitation, or a bona fide bug?
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 le TypeScript Playground lié et l'exemple minimal de contrainte générique dans l'issue. Examinez pourquoi la contrainte d'accès indexé est traitée comme une intersection plutôt que comme l'union attendue, en tenant compte de la régression signalée entre les versions 3.3 et 3.5 et de l'issue associée #30769. Le travail est terminé lorsqu'il est déterminé si ce comportement est intentionnel ou lorsque le comportement est corrigé afin que U soit accepté sans TS2344.
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é
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100