javascript - 如何使 TypeScript 枚举限制为特定数字

标签 javascript reactjs typescript

我使用数字枚举类型来设置页面的访问代码:

export enum AdminAccess {
  None = 0,
  Dashboard = 1 << 0,
  ModifyUserInfo = 1 << 1,
  Publish = 1 << 2
}

我希望路由采用 AdminAccess 类型的参数,这样它只能在上面的值之间进行选择:

export interface AuthRouteProps {
  children: JSX.Element;
  path: string;
  pageIdentity: AdminAccess;
  exact?: boolean;
}

但是类型检查并没有像我预期的那样工作,只要我输入数字,检查就会通过。但我想要的是你只能输入AdminAccess.None , AdminAccess.Dashboard等等

<AuthRoute
  path={"somepath"}
  pageIdentity={AdminAccess.ModifyUserInfo} // pass check
  children={<ModifyUserInfoPage />}
/>
<AuthRoute
  path={"somepath"}
  pageIdentity={897654987} // also pass check
  children={<ModifyUserInfoPage />}
/>

我怎样才能做到这一点?

最佳答案

这个问题可能与 "What is the significance of enum in TypeScript" 重复。将答案转化为您的问题会产生如下结果:

无论好坏,TypeScript 中的数字枚举都可以分配给 number 或从 enum 分配,这直接导致了您所看到的问题。您可能会更好地放弃 namespace ,转而使用显式 numeric literal types 组合 type1 << 2 ,如下所示:

export namespace AdminAccess {
  export const None = 0
  export const Dashboard = 1
  export const ModifyUserInfo = 2
  export const Publish = 4;
}
export type AdminAccess = typeof AdminAccess[keyof typeof AdminAccess];

const good: AdminAccess = AdminAccess.ModifyUserInfo; // okay
const bad: AdminAccess = 289849284924; // error
//    ~~~ <---
// Type '289849284924' is not assignable to type '0 | 1 | 2 | 4'.(2322)

请注意,像 4 这样的计算枚举需要替换为 ojit_code 这样的数字文字值才能正常工作(数字计算不会产生数字文字类型)。

希望有帮助;祝你好运!

Link to code

关于javascript - 如何使 TypeScript 枚举限制为特定数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59205588/

相关文章:

reactjs - 未捕获的类型错误 : Cannot read property 'mountComponent' of undefined error when running create-react-app build version

javascript - 类型 'mergeMap' 上不存在属性 'Observable<any>'

javascript - 如何循环枚举值以在单选按钮中显示?

javascript - 使用 Angular-CLI 正确配置脚本

javascript - 如何将内容div json的显示限制为三个

javascript - 使用 React 更新 HTML5 视频的源 URL

javascript - 如何使用替换创建 "bbcode"javascript

javascript - 在 express 项目中添加 create-react-app 作为前端

javascript - 将宽度更改为 100% 的 Google+ 嵌入式帖子

javascript - JS 类不适用于日期选择器