microsoft / microsoft/TypeScript

A trivial generic interface extending a generic type handles assignability differently than the base type

Abierto
#41,370 1 comentario 1 reacción 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Needs Investigation
Lenguaje dominante
Go
Estrellas
111k
Forks
14.3k
Merge medio
2 d 4 h
PR fusionados (30 d)
132

Descripción

TypeScript Version: 4.0.5, 4.1.0-beta, 4.1.0-dev.20201102

Search Terms: generic interface assignability

Code

type Assert<T, U extends T> = U;

type A = { value: 5, a: true };
type B = { value: 5, b: true };

interface Box<T> {
    value: T;
}

type _Rebox<T extends Box<any>> = Box<T["value"]>;

namespace Test0 {
    type Rebox<T extends Box<any>> = _Rebox<T>;

    export type Assertions = [
        Assert<Box<5>, Rebox<A>>, // Correctly passes
        Assert<Rebox<A>, Box<5>>, // Correctly passes

        Assert<Box<5>, Rebox<B>>, // Correctly passes
        Assert<Rebox<B>, Box<5>>, // Correctly passes

        Assert<Rebox<A>, Rebox<B>>, // Correctly passes
    ];
}

namespace Test1 {
    interface Rebox<T extends Box<any>> extends _Rebox<T> {};

    export type Assertions = [
        Assert<Box<5>, Rebox<A>>, // Correctly passes
        Assert<Rebox<A>, Box<5>>, // Correctly passes

        Assert<Box<5>, Rebox<B>>, // Correctly passes
        Assert<Rebox<B>, Box<5>>, // Correctly passes

        Assert<Rebox<A>, Rebox<B>>, // Incorrectly fails
    ];
}

Expected behavior: Test0.Assertions and Test1.Assertions should both resolve with no errors.

Actual behavior: When Rebox is an interface (in Test1), Rebox<B> is not assignable to Rebox<A>.

Playground Link

Related Issues: N/A

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 la reproducción en TypeScript del issue y compara los resultados de asignabilidad para las formas de alias de tipo e interfaz en Test0 y Test1. Rastrea el comportamiento del compilador con las interfaces genéricas y la asignabilidad, y añade una prueba de regresión que muestre que Rebox es asignable a Rebox y que ambos conjuntos de aserciones se resuelven sin errores.

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
Estancado
Claridad
Bien especificado
Aptitud para principiantes
35/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.