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

时间:2019-12-06 01:25:14

标签: 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.NoneAdminAccess.Dashboard等。

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

我该如何工作?

1 个答案:

答案 0 :(得分:0)

该问题可能与"What is the significance of enum in TypeScript"相同。将那里的答案翻译成您的问题会产生如下结果:

无论好坏,都可以向number和从enum分配TypeScript中的数字枚举,这直接导致您遇到的问题。您最好通过namespacetype的组合使用显式numeric literal types来使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) 更好,例如:

1 << 2

请注意,必须将4之类的计算枚举替换为Questions之类的数字文字值才能起作用(数字计算不会产生数字文字类型)。

希望有所帮助;祝你好运!

Link to code