枚举类型:类型缺少以下属性

Ich*_*aki 2 typescript

我有一些类型定义如下:

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)

我该如何解决这个问题?

cap*_*ian 5

这个类型:

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)

操场