microsoft / microsoft/TypeScript

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

Offen
#41,370 1 Kommentar 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Needs Investigation
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.3k
Ø Merge
2 T. 4 Std.
Gemergte PRs (30 T.)
132

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit der TypeScript-Reproduktion im Issue und vergleiche die Assignability-Ergebnisse für die Type-Alias- und Interface-Formen in Test0 und Test1. Verfolge das Verhalten des Compilers bei generischen Interfaces und der Assignability und füge einen Regressionstest hinzu, der zeigt, dass Rebox Rebox zugewiesen werden kann und dass beide Assertion-Sets ohne Fehler aufgelöst werden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.