如何检查字符串是否为类型

TSR*_*TSR 2 types typescript

我有这样的类型:

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)

  • 是否有一些通用/动态的东西,因为在这种特殊情况下,列表可以更新并且需要记住更新它。 (4认同)