typescript - Hvordan sjekke om streng er i type


Jeg har typen:

export type PermissionType = 'creator' | 'editor' | 'viewer' 

Ved kjøring, hvordan sjekke om en variabel userInput faktisk er av typen ovenfor

let userInput = 'foo' //
isOfTypePermission(userInput)  // should return false or throw an error

let userInput2 = 'creator'
isOfTypePermission(userInput2) // should return true

Med andre ord, hvordan få typen PermissionType kompilert til et JavaScript-array slik at jeg bare kan gjøre indexOf(userInput) > -1

Svar #1

Ikke gjør det mer komplisert enn nødvendig.

function isOfTypePermission (userInput: string): userInput is PermissionType {
  return ['creator', 'editor', 'viewer'].includes(userInput);
}

Se Hva gjør `is`-nøkkelordet i TypeScript? for mer informasjon om hvorfor vi ikke bare bruker en boolean-returtype.

Hvis PermissionType din er veldig lang, kan det være verdt å utlede typen fra en const-verdi i stedet.

const permissions = ['creator', 'editor', 'viewer'] as const;
type PermissionType = (typeof permissions)[number];

function isOfTypePermission (userInput: string): userInput is PermissionType {
  return (permissions as readonly string[]).includes(userInput);
}

Eller muligens til og med en Set

const permissions = new Set(['creator', 'editor', 'viewer'] as const);
type PermissionType = typeof permissions extends Set<infer T> ? T : never;

function isOfTypePermission (userInput: string): userInput is PermissionType {
  return (permissions as Set<string>).has(userInput);
}

Relaterte artikler