typescript - De ce constrângerea generică pentru proprietăți eșuează cu interfața, dar nu cu tipul


Uită-te la acest fragment:

type Constrained<T extends { [K in string]: string }> = T;

type A = {
    p: string;
}

interface B {
    p: string;
}

type R1 = Constrained<A>; // Why this is OK...
type R2 = Constrained<B>; // ... and this an Error?

loc de joacă

Știu că constrângerea ar putea fi exprimată diferit pentru a evita eroarea, de exemplu,

type Constrained<T extends { [K in keyof T]: string }> = T;

și soluții precum aceasta pot fi găsite aici sau aici.

Întrebarea principală este: de ce interface eșuează, dar type nu?

Presupun că este pentru că interfețele sunt deschise (ele pot fi extinse/fuzionate).

Deoarece mesajul de eroare este ceva de genul

Semnătura indexului lipsește în tipul 'B'.

Cred că acest PR este relevant. În acest caz, apare o altă întrebare:

Este un tip declarat cu type reprezentarea unui tip literal de obiect?