簡體   English   中英

枚舉類型:缺少類型中的以下屬性

[英]enum type: is missing the following properties from type

我有一些類型定義如下:

export type Permission = keyof typeof UserPermissions | undefined;

export type Role = keyof typeof UserRoles;

export type PermissionMap = {
  [P in UserPermissions]: { [R in UserRoles]: boolean };
};

用戶權限

enum UserPermissions {
  A = 'A',
  B = 'B',
  C = 'C',
  D = 'D',
  E = 'E',
}

用戶角色

enum UserRoles {
  ADMIN = 'ADMIN',
  STANDARD = 'STANDARD',
}

當我如下定義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,
  },
};

我收到以下錯誤:

鍵入'{ A:{標准:假; 管理員:是的; }; B:{標准:假; 管理員:是的; }; C:{標准:真; 管理員:是的; }; }' 缺少“PermissionMap”類型的以下屬性:D、E

在另一種情況下:

const permissions: PermissionMap = {
      [UserPermissions.A]: {
        [UserRoles.ADMIN]: true,
      },
      [UserPermissions.B]: {
        [UserRoles.ADMIN]: true,
      },
      [UserPermissions.C]: {
        [UserRoles.ADMIN]: true,
      },
    };

我收到以下錯誤:

計算屬性值的類型是 '{ ADMIN: true; }',不能分配給類型 '{ ADMIN: boolean; 標准:布爾值; }'。
'{ ADMIN: true; 類型中缺少屬性 'STANDARD' }' 但在 '{ ADMIN: boolean; 類型中是必需的標准:布爾值; }'.ts(2418)

我該如何解決這個問題?

這個類型:

export type PermissionMap = {
  [P in UserPermissions]: { [R in UserRoles]: boolean };
};

意味着需要所有UserPermissions鍵: A, B, C, D, E而在const permissions中,您僅使用A, B, C 如果這是故意的,您可以從UserPermissions中排除D, E鍵。

因此,您可以參數化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,
    },
};

操場

或者您可以使用部分實用程序類型:


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,
    },
};

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM