typescript - Gränssnitt kan inte utöka mappad typ i villkorlig typ
Medan jag felsökte mitt program märkte jag att följande exempel ger ett kompileringsfel (playground).
type Foo = {key: string};
interface Bar {key: string};
type Baz = Foo extends Record<string, unknown>? any: never;
type Qux = Bar extends Record<string, unknown>? any: never;
const baz: Baz = 0;
const qux: Qux = 0; // Type 'number' is not assignable to type 'never'.
Det verkar som att gränssnitt inte kan utöka Record<string, unknown> medan typer kan. Jag vet att det finns flera skillnader mellan typer och gränssnitt i TypeScript, och jag misstänker att det faktum att mappade typer inte kan användas i gränssnitt kan förklara beteendet. Jag kan dock inte helt förstå varför denna begränsning av mappade typer resulterar i att Qux blir never, även om det är fallet.
Dessutom är interface Foobar extends Record<string, unknown> { key: string }; en giltig gränssnittsdefinition, vilket gör felet mer förvirrande för mig.
Kan någon hjälpa mig att förstå detta fel?
Svar #1
Det beror på att typalias har en implicit indexsignatur, men det har inte gränssnitt.
Om du lägger till ett indexsignatur till gränssnittet - kommer Qux att resultera i any:
interface Bar {
key: string;
[p: string]: string;
};
Lekplats
Mer information här:
Detta beteende är för närvarande enligt design. Eftersom gränssnitt kan utökas med ytterligare deklarationer men typalias inte kan det, är det "säkrast" (tunga citationstecken på det) att härleda en implicit indexsignatur för typalias än för gränssnitt.
