如何检查类型中的字符串[重复]
Posted
技术标签:
【中文标题】如何检查类型中的字符串[重复]【英文标题】:How to check if string in type [duplicate] 【发布时间】:2019-11-25 16:24:15 【问题描述】:我有这种类型:
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
【问题讨论】:
你会想要使用 switch 语句 您不能将 PermissionType 编译到 javascript 数组中,但您可以从数组中的值推断出类型。 【参考方案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);
【讨论】:
这就是我喜欢代数类型的原因,我希望其他语言也支持它! 是否有一些通用/动态的东西,因为在这种特殊情况下,列表可能会被更新并且需要记住更新它。 @Bleicher 问题是关于字符串文字联合的类型。如果您确定该值包含在运行时动态的列表中,听起来您将无法实际限制类型。你仍然只知道它是string
。以上是关于如何检查类型中的字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何检查字符串中的三个或更多空格 - Python [重复]