我的类型是
export type PermissionType = 'creator' | 'editor' | 'viewer'
在运行时,如何检查变量userInput是否实际上是上面的类型之一
let userInput = 'foo' //
isOfTypePermission(userInput) // should return false or throw an error
let userInput2 = 'creator'
isOfTypePermission(userInput2) // should return true
换句话说,如何将类型 PermissionType 编译为JavaScript数组,以便我可以执行 indexOf(userInput)> -1
答案 0 :(得分:3)
不要过于复杂。
function isOfTypePermission (userInput: string): userInput is PermissionType {
return ['creator', 'editor', 'viewer'].includes(userInput);
}
有关为什么我们不仅仅使用boolean
返回类型的更多信息,请参见What does the `is` keyword do in typescript?。
如果您的PermissionType
确实很长,那么值得从const
值推断类型。
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);
}
甚至可能是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);
}