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

时间:2019-07-16 21:23:41

标签: typescript types

我的类型是

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

1 个答案:

答案 0 :(得分:3)

不要过于复杂。

function isOfTypePermission (userInput: string): userInput is PermissionType {
  return ['creator', 'editor', 'viewer'].includes(userInput);
}

有关为什么我们不仅仅使用boolean返回类型的更多信息,请参见What does the `is` keyword do in typescript?

如果您的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);
}