我有以下情况:
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;
}
};
答案 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 ,其键为User
,Password
和{{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
好的,希望能有所帮助。祝你好运!