我有一些类型定义如下:
export type Permission = keyof typeof UserPermissions | undefined;
export type Role = keyof typeof UserRoles;
export type PermissionMap = {
[P in UserPermissions]: { [R in UserRoles]: boolean };
};
Run Code Online (Sandbox Code Playgroud)
用户权限:
enum UserPermissions {
A = 'A',
B = 'B',
C = 'C',
D = 'D',
E = 'E',
}
Run Code Online (Sandbox Code Playgroud)
用户角色:
enum UserRoles {
ADMIN = 'ADMIN',
STANDARD = 'STANDARD',
}
Run Code Online (Sandbox Code Playgroud)
PermissionMap当我定义如下类型的对象时:
const permissions: PermissionMap = {
[UserPermissions.A]: {
[UserRoles.STANDARD]: false,
[UserRoles.ADMIN]: true,
},
[UserPermissions.B]: {
[UserRoles.STANDARD]: false,
[UserRoles.ADMIN]: true,
},
[UserPermissions.C]: {
[UserRoles.STANDARD]: true,
[UserRoles.ADMIN]: true,
},
};
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
类型 '{ A: { 标准: false; 管理员:真实;}; B:{标准:假;管理员:真实;}; C:{ 标准:真;管理员:真实;}; }' 缺少类型“PermissionMap”中的以下属性:D、E
在另一种情况下:
const permissions: PermissionMap = {
[UserPermissions.A]: {
[UserRoles.ADMIN]: true,
},
[UserPermissions.B]: {
[UserRoles.ADMIN]: true,
},
[UserPermissions.C]: {
[UserRoles.ADMIN]: true,
},
};
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
计算属性值的类型为 '{ ADMIN: true; }',它不可分配给类型 '{ ADMIN: boolean; 标准:布尔值;}'。
类型“{ ADMIN: true;”中缺少属性“STANDARD” }' 但在类型 '{ ADMIN: boolean; 中是必需的;标准:布尔值;}'.ts(2418)
我该如何解决这个问题?
这个类型:
export type PermissionMap = {
[P in UserPermissions]: { [R in UserRoles]: boolean };
};
Run Code Online (Sandbox Code Playgroud)
意味着需要所有UserPermissions键:A, B, C, D, E而在const permissions您只使用A, B, C. 如果这是故意的,您可以D, E从 中排除键UserPermissions。
因此,您可以参数化PermissionMap类型:
enum UserPermissions {
A = 'A',
B = 'B',
C = 'C',
D = 'D',
E = 'E',
}
enum UserRoles {
ADMIN = 'ADMIN',
STANDARD = 'STANDARD',
}
export type Permission = keyof typeof UserPermissions | undefined;
export type Role = keyof typeof UserRoles;
export type PermissionMap<Without extends string = never> = {
[P in Exclude<UserPermissions, Without>]: { [R in UserRoles]: boolean };
};
const permissions: PermissionMap<UserPermissions.D | UserPermissions.E> = {
[UserPermissions.A]: {
[UserRoles.STANDARD]: false,
[UserRoles.ADMIN]: true,
},
[UserPermissions.B]: {
[UserRoles.STANDARD]: false,
[UserRoles.ADMIN]: true,
},
[UserPermissions.C]: {
[UserRoles.STANDARD]: true,
[UserRoles.ADMIN]: true,
},
};
Run Code Online (Sandbox Code Playgroud)
或者您可以使用部分实用程序类型:
enum UserPermissions {
A = 'A',
B = 'B',
C = 'C',
D = 'D',
E = 'E',
}
enum UserRoles {
ADMIN = 'ADMIN',
STANDARD = 'STANDARD',
}
export type Permission = keyof typeof UserPermissions | undefined;
export type Role = keyof typeof UserRoles;
export type PermissionMap = Partial<{
[P in UserPermissions]: { [R in UserRoles]: boolean };
}>
const permissions: PermissionMap = {
[UserPermissions.A]: {
[UserRoles.STANDARD]: false,
[UserRoles.ADMIN]: true,
},
[UserPermissions.B]: {
[UserRoles.STANDARD]: false,
[UserRoles.ADMIN]: true,
},
[UserPermissions.C]: {
[UserRoles.STANDARD]: true,
[UserRoles.ADMIN]: true,
},
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1293 次 |
| 最近记录: |