我有这样的类型:
export type PermissionType = 'creator' | 'editor' | 'viewer'
Run Code Online (Sandbox Code Playgroud)
在运行时,如何检查变量 userInput 是否实际上是上述类型之一
let userInput = 'foo' //
isOfTypePermission(userInput) // should return false or throw an error
let userInput2 = 'creator'
isOfTypePermission(userInput2) // should return true
Run Code Online (Sandbox Code Playgroud)
换句话说,如何将PermissionType类型编译成一个 javascript 数组,以便我可以只做indexOf(userInput) > -1
Pat*_*rts 12
不要把它复杂化。
function isOfTypePermission (userInput: string): userInput is PermissionType {
return ['creator', 'editor', 'viewer'].includes(userInput);
}
Run Code Online (Sandbox Code Playgroud)
请参阅打字稿中的“is”关键字有什么作用?有关为什么我们不只使用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);
}
Run Code Online (Sandbox Code Playgroud)
或者甚至可能 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1121 次 |
| 最近记录: |