TypeScript:使用Map中的键作为类型

TypeScript:使用Map中的键作为类型,typescript,ecmascript-6,Typescript,Ecmascript 6,我想使用映射的键作为方法参数的类型。该地图具有以下键: const后缀=新映射; 后缀.setread,read1; 后缀.setwrite,write1; 后缀.setdelete,delete1; 后缀:setadmin,admin1; 目前,我正在使用以下静态结构来获取有效的参数值: getNameExtensionSuffixtype:read | write | delete | admin:string{ 如果此后缀为hastype{ 返回this.suffix.gettype; }

我想使用映射的键作为方法参数的类型。该地图具有以下键:

const后缀=新映射; 后缀.setread,read1; 后缀.setwrite,write1; 后缀.setdelete,delete1; 后缀:setadmin,admin1; 目前,我正在使用以下静态结构来获取有效的参数值:

getNameExtensionSuffixtype:read | write | delete | admin:string{ 如果此后缀为hastype{ 返回this.suffix.gettype; } }
如何做到更具活力?我希望能够在不强制更改方法的情况下向映射添加新键。

如果任何键都可以,您可以使用字符串

getNameExtensionSuffix(type: string): string {
  ...
}

如果任何键都可以,那么您可以使用字符串

getNameExtensionSuffix(type: string): string {
  ...
}

我建议为您的映射的接受键声明一个枚举,因为您希望将其限制为字符串的子集:

enum SuffixKeys {
    READ = 'read',
    WRITE = 'write',
    DELETE = 'delete',
    ADMIN = 'admin',
}

const suffix = new Map<SuffixKeys, string>();
suffix.set(SuffixKeys.READ, "read1");
suffix.set(SuffixKeys.WRITE, "write1");
suffix.set(SuffixKeys.DELETE, "delete1");
suffix.set(SuffixKeys.ADMIN, "admin1");
如果启用了strictNullChecks,则需要强制返回类型,因为它可能未定义:

getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type) || '';
}
getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type)!;
}
…或者你可以告诉Typescript我知道我在做什么,它永远不会被定义:

getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type) || '';
}
getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type)!;
}

我建议为您的映射的接受键声明一个枚举,因为您希望将其限制为字符串的子集:

enum SuffixKeys {
    READ = 'read',
    WRITE = 'write',
    DELETE = 'delete',
    ADMIN = 'admin',
}

const suffix = new Map<SuffixKeys, string>();
suffix.set(SuffixKeys.READ, "read1");
suffix.set(SuffixKeys.WRITE, "write1");
suffix.set(SuffixKeys.DELETE, "delete1");
suffix.set(SuffixKeys.ADMIN, "admin1");
如果启用了strictNullChecks,则需要强制返回类型,因为它可能未定义:

getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type) || '';
}
getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type)!;
}
…或者你可以告诉Typescript我知道我在做什么,它永远不会被定义:

getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type) || '';
}
getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type)!;
}

为什么不在ts中定义枚举类型? 详情如下:

enum E { A, B }
const keys = Object.keys(E).filter(k => typeof E[k as any] === "number"); // ["A", "B"]
const values = keys.map(k => E[k as any]); // [0, 1]
参考:


为什么不在ts中定义枚举类型? 详情如下:

enum E { A, B }
const keys = Object.keys(E).filter(k => typeof E[k as any] === "number"); // ["A", "B"]
const values = keys.map(k => E[k as any]); // [0, 1]
参考:


这是可能的。解决方案的灵感来自于此


这是可能的。解决方案的灵感来自于此


其中一种方法是使用typescript枚举


但是,由于映射中的键可能是动态的,所以您可以在运行时更改并向枚举中添加值。

其中一种方法是使用typescript枚举


但是,由于映射中的键可能是动态的,因此您可以在运行时更改并向枚举中添加值。

如果要动态执行此操作,请仅获取当前映射中存在的键,那么suffix.hastype是执行此操作的唯一方法-没有类型来表示此操作。如果要动态执行此操作,仅获取当前地图中存在的键,然后suffix.hastype是唯一的方法-没有类型来表示这一点。如上所述,它应该将参数选项限制为可用键。请参阅更新的代码示例。如上所述,它应将参数选项限制为可用键。请参阅更新的代码示例感谢您提供了这个有趣的解决方案,它可以工作,但是对于这个简单的问题,我不想扩展默认类型定义。感谢您提供了这个有趣的解决方案,它可以工作,但是对于这个简单的问题,我不想扩展默认类型定义。