问一个ts的问题,怎么通过两个枚举合并生成另外一个枚举?

作者站长头像
站长
· 阅读数 7

权限码时有模块枚举和权限枚举共同组成的,比如:

enum PermModuleCodeEnum {
  EnterpriseTenant = 'enterpriseTenant',
  EnterpriseIncoming = 'enterpriseIncoming',
  EnterpriseIncoming1 = 'enterpriseIncoming1',
}

type PremCode = 'Add' | 'Disable' | 'Edit'

function createPerCodes<T extends string>(union: T[], module: PermModuleCodeEnum): { [K in T]: `${PermModuleCodeEnum}:${K}` } {
  return union.reduce((pre, cur) => ({ ...pre, [cur]: `${module}:${cur}` }), {} as { [K in T]: `${PermModuleCodeEnum}:${K}` });
}

const perCodes = createPerCodes<PremCode>(['Add', 'Disable', 'Edit'], PermModuleCodeEnum.EnterpriseTenant);

console.log('xxx-1', perCodes);


此时此时的 perCodes为 {
    Add: "enterpriseTenant:Add" | "enterpriseIncoming:Add" | "enterpriseIncoming1:Add";
    Disable: "enterpriseTenant:Disable" | "enterpriseIncoming:Disable" | "enterpriseIncoming1:Disable";
    Edit: "enterpriseTenant:Edit" | "enterpriseIncoming" | "enterpriseIncoming1:Edit";
}

而不是

{
    Add: "enterpriseTenant:Add";
    Disable: "enterpriseTenant:Disable";
    Edit: "enterpriseTenant:Edit";
}

怎样才能修复createPerCodes的类型定义呢

回复
1个回答
avatar
test
2024-06-28
enum PermModuleCodeEnum {
  EnterpriseTenant = 'enterpriseTenant',
  EnterpriseIncoming = 'enterpriseIncoming',
  EnterpriseIncoming1 = 'enterpriseIncoming1',
}

type PremCode = 'Add' | 'Disable' | 'Edit';

function createPerCodes<T extends string, M extends PermModuleCodeEnum>(union: T[], module: M): { [K in T]: `${M}:${K}` } {
  return union.reduce((pre, cur) => ({ ...pre, [cur]: `${module}:${cur}` }), {} as { [K in T]: `${M}:${K}` });
}

const perCodes = createPerCodes<PremCode, typeof PermModuleCodeEnum.EnterpriseTenant>(['Add', 'Disable', 'Edit'], PermModuleCodeEnum.EnterpriseTenant);

console.log('xxx-1', perCodes);
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容