如何检查类型中的字符串[重复]

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 [重复]

如何检查NSString中的每个字符? [重复]

检查 JavaScript 数组中的重复字符串

如何检查字符串文字类型是不是包含 TypeScript 中的值?

python如何检查字符串是不是是字符串列表的元素[重复]

检查字符串中的 4 个句点 [重复]