我有这样的类型:
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
不要过于复杂。
function isOfTypePermission (userInput: string): userInput is PermissionType {
return ['creator', 'editor', 'viewer'].includes(userInput);
}
参见 What does the `is` keyword do in typescript?有关为什么我们不只使用 boolean
返回类型的更多信息。
如果您的 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);
}