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

Tho*_*ark 4 typescript ecmascript-6

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

const suffix = new Map<string, string>;
suffix.set("read", "read1");
suffix.set("write", "write1");
suffix.set("delete", "delete1");
suffix.set("admin", "admin1");
Run Code Online (Sandbox Code Playgroud)

目前我正在使用以下静态结构来获取有效的参数值:

getNameExtensionSuffix(type: "read" | "write" | "delete" | "admin"): string {
  if(this.suffix.has(type)) {
    return this.suffix.get(type);
  }
}
Run Code Online (Sandbox Code Playgroud)

如何做到更有活力?我希望能够向地图添加新键,而不必被迫更改方法。

Ter*_*rry 5

我建议enum为您的地图声明一个可接受的键,因为您希望将其限制为字符串的子集:

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");
Run Code Online (Sandbox Code Playgroud)

然后,当尝试从地图检索值时,您可以执行以下操作:

getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type);
}
Run Code Online (Sandbox Code Playgroud)

如果您已strictNullChecks启用,您将需要强制返回类型,因为它可能是未定义的:

getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type) || '';
}
Run Code Online (Sandbox Code Playgroud)

...或者你可以告诉 Typescript “我知道我在做什么,它永远不会是未定义的”:

getNameExtensionSuffix(type: SuffixKeys): string {
  return suffix.get(type)!;
}
Run Code Online (Sandbox Code Playgroud)