Varför kan ett gränssnitt inte ha mappade egenskaper i TypeScript?
Överväg följande enum:
enum Numbers {
ONE=1,
TWO=2
}
Följande gränssnittsdefinition ger kompileringsfel.
interface Config {
[n in Numbers]: string;
}
- Ett beräknat egenskapsnamn i ett gränssnitt måste hänvisa till ett uttryck vars typ är en litteral typ eller en 'unik symbol'-typ.
- Ett beräknat egenskapsnamn måste vara av typen 'string', 'number', 'symbol' eller 'any'.
- Kan inte hitta namnet 'n'.
Men om jag använder en typalias:
type Config = {
[n in Numbers]: string;
}
Eller flytta den mappade typen djupare i definitionen:
interface Config {
a: {
[n in Numbers]: string;
};
}
Det kompilerar bara bra.
Så, varför kan en topplivsegenskap i ett gränssnitt inte vara en mappad typ?
PS: På TypeScript-lekplatsen använder jag v4.2.3.
Svar #1
TypeScript stöder för närvarande inte att göra detta med gränssnitt—jag är inte säker på om det finns en anledning till varför det inte gör det, förutom “det har inte implementerats”.
Tack och lov verkar detta finnas på färdplanen för TS4.4 via denna PR: https://github.com/microsoft/TypeScript/pull/26797
Redigera: Som förklarat i kommentarerna nedan täcker inte PR:en ovan helt det beteende som önskas i den ursprungliga frågan.