typescript - 如何检查字符串类型

标签 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

最佳答案

不要过于复杂。

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);
}

关于typescript - 如何检查字符串类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57065617/

相关文章:

typescript - TypeScript项目中如何使用OffscreenCanvas

typescript - 我可以覆盖 TypeScript 接口(interface)中的键吗?

javascript - "CUSTOM_ELEMENTS_SCHEMA"Angular 2 App 测试错误

C++ unordered_map 错误

postgresql - 从函数返回的自定义类型的意外行为

java - Java中如何声明48位定宽数据类型?

javascript - html 不会从 Angular 2 组件内部渲染

typescript - 反射(reflect)元数据并查询装饰器的对象

php - 为什么 PHP 严格类型允许错误类型的函数参数?

python - python 中的 typing.cast 是做什么的?