microsoft / microsoft/TypeScript

type parameter variance in generic call signature is incorrectly bivariant

Abierto
#63,677 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Bug Domain: check: Variance Relationships
Lenguaje dominante
Go
Estrellas
111k
Forks
14.3k
Merge medio
2 d 4 h
PR fusionados (30 d)
132

Descripción

🔎 Search Terms

unsound generic function assignability type parameter variance generic call signature bivariant

🕗 Version & Regression Information
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about generics and variance.
⏯ Playground Link

https://www.typescriptlang.org/play/?ts=6.0.3#code/C4TwDgpgBAygFgewK4BsAmAhCBJAdgNwEMAnAS0N2AB4ARAPigF4oqAVOgCgA8AuKVgGQ0ANFBB9WASkZ1BNAFDyAxglwBnYFDUQVuNH3jJ0WPETIVqSXAGtcCAO64GzKN1EhJTBiGWqNUZGAAOSQAWwAjCGIDRFRMHAISckoqXDDI4mctHVU0eUCQiKiqK1sHJw4AFlEAcg1iGskAOmAEAFEuMFUISnIUDklFXX9SXEKMmKN40ySLVPSorO5PGVcuFvbO7t7CfslRLkHhzVGAVRs7R0m4k0TzFNLLpyYoUfGo+TOL8o464AbavVGoogA

💻 Code
type ShouldBeInvariant<D> = <T>(x: T&D, y: T)=>T&D

const second: ShouldBeInvariant<unknown> =  (x, y) => y
const outNumber: ShouldBeInvariant<number> = second
outNumber<unknown>(4, 'str').toExponential()

const inNumber: ShouldBeInvariant<number> = (x) => (x.toExponential(), x)
const inUnknown: ShouldBeInvariant<unknown> = inNumber
inUnknown('str', 'str')

🙁 Actual behavior

The code type checks, while it shouldn't because that is unsound, using ShouldBeInvariant covariantly or contravariantly both causes runtime errors.

🙂 Expected behavior

ShouldBeInvariant should be invariant against its parameter. Both assigns:

const outNumber: ShouldBeInvariant<number> = second

and

const inUnknown: ShouldBeInvariant<unknown> = inNumber

should report errors

Additional information about the issue

No response

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza con el ejemplo vinculado de TypeScript Playground y reproduce las asignaciones no seguras que involucran ShouldBeInvariant. Rastrea la asignabilidad de las firmas de llamada genéricas y la comprobación de varianza; después, añade una prueba de regresión que muestre que ambas asignaciones producen errores y que las llamadas inválidas ya no pasan la comprobación de tipos.

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
4/5
Tiempo estimado
3-5 días
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
48/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.