typescript - Skapa en typ som tar ett enum-argument


Jag försöker skapa en återanvändbar typ som använder Record-typen.

enum MyKeys {
  ALPHA = 'ALPHA',
  BETA = 'BETA',
  GAMMA = 'GAMMA',
}

interface MyValues {
  in: any[];
  out: any[];
}

type Case<T> = Record<T, MyValues>;

Idealiskt kan jag använda Case<MyKeys> istället för Record<MyKeys, MyValues>.

Typen 'T' uppfyller inte begränsningen 'string | number | symbol'.

Typ 'T' kan inte tilldelas typen 'symbol'

Svar #1

Typargumentet T måste begränsas till en giltig indextyp:

type Case<T extends string> = Record<T, MyValues>;

Svar #2

De enda giltiga typerna som kan användas för nycklar är strängar, nummer och symboler. TypeScript tillhandahåller ett inbyggt alias för en sådan union som kallas PropertyKey.

Den inbyggda Record-typen kommer bara att acceptera en av dessa. Därför behöver din typkonstruktör ha samma begränsning också.

type Case<T extends PropertyKey> = Record<T, MyValues>;