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);
}
