microsoft / microsoft/TypeScript
Type parameter not usable as type argument in identical type; union in constraint becomes intersection
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 2 d 4 h
- PR fusionados (30 d)
- 132
Descripción
🔎 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?
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con el TypeScript Playground enlazado y el ejemplo mínimo de una restricción genérica del issue. Investiga por qué la restricción de acceso indexado se trata como una intersección en lugar de la unión esperada, teniendo en cuenta la regresión reportada entre las versiones 3.3 y 3.5 y el issue relacionado #30769. Se considera terminado cuando se haya determinado si esto es intencionado o se haya corregido el comportamiento para que U se acepte sin TS2344.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100