我使用枚举类型来设置页面的访问代码:
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 />}
/>
我该如何工作?
答案 0 :(得分:0)
该问题可能与"What is the significance of enum
in TypeScript"相同。将那里的答案翻译成您的问题会产生如下结果:
无论好坏,都可以向number
和从enum
分配TypeScript中的数字枚举,这直接导致您遇到的问题。您最好通过namespace
和type
的组合使用显式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
之类的数字文字值才能起作用(数字计算不会产生数字文字类型)。
希望有所帮助;祝你好运!