使用Typescript枚举值创建新类型

时间:2019-07-01 19:06:04

标签: typescript

我有以下情况:

enum FieldsMap {
  User = "user-name",
  Password = "user-password",
  Country = "user-country"
}

type Fields = "user-name" | "user-password" | "user-country";

您可以看到Fields重复了FieldsMap的值,Fields是否可以使用FieldsMap values 为了避免重复?另外,我在这里将FieldsMap用作enum,但是我可以根据需要更改它,只是在尽量避免使用字符串:

const onChangeHandler = (key: Fields, value: string) => {
  switch (key) {
    case FieldsMap.User:
      // do something with `value`
      break;
    case FieldsMap.Password:
      // do something with `value`
      break;
    case FieldsMap.Country:
      // do something with `value`
      break;
  }
};

2 个答案:

答案 0 :(得分:4)

Template Literal Types 发布后,你可以直接使用:

type Fields = `${FieldsMap}` // "user-name" | "user-password" | "user-country"

答案 1 :(得分:1)

只需在TypeScript中将其写为答案...,enums就已经具有您要查找的行为,而无需定义任何其他类型。

即以下枚举定义:

enum Fields {
  User = "user-name",
  Password = "user-password",
  Country = "user-country"
}

将名为Fields引入范围,该 value 具有 properties ,其键为UserPassword和{{1 }},其值分别为Country"user-name""user-password"。此值使其进入运行时,如:

"user-country"

,与值相似:

const x = Fields.User; // makes it to the emitted JS

但是它也将名为const FieldsLike = { User: "user-name", Password: "user-password", Country: "user-country" } as const; const xLike = FieldsLike.User; // makes it to the emitted JS; type 纳入范围,它等效于Fields对象中属性值的 union 。发出JS时,此类型为erased,与其他类型系统一起使用,但是可以在设计时通过类型注释和使用IntelliSense进行访问,例如:

Fields

并且类似于类型

const y: Fields = x; // the "Fields" annotation is the type

这是您要查找的类型;见下文。

顺便说一句,枚举用作命名空间,并为每个枚举成员提供导出类型:

type FieldsLike = (typeof FieldsLike)[keyof typeof FieldsLike];
// type FieldsLike = "user-name" | "user-password" | "user-country"

const yLike: FieldsLike = xLike; // the "FieldsLike" annotation is the type

(因此,左侧的const z: Fields.Password = Fields.Password; // type and value type 的名称,而右侧的Fields.Password value 的名称>)。因此,Fields.Password下可访问的类型类似于名称空间:

Fields

哇,这意味着仅使用namespace FieldsLike { export type User = typeof FieldsLike.User; export type Password = typeof FieldsLike.Password; export type Country = typeof FieldsLike.Country; } const zLike: FieldsLike.Password = FieldsLike.Password; // type and value 定义就可以同时给我们enum Fields { ... }const FieldsLike = ...type FieldsLike = ...的行为。

让我们备份...您要查找的类型,即namespace FieldsLike枚举下所有属性的并集,已经是一个名为Fields的类型。 (好的,我将您的Fields的名称更改为FieldsMap),您可以直接使用它:

Fields

好的,希望能有所帮助。祝你好运!

Link to code