首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举值类型

枚举值类型
EN

Stack Overflow用户
提问于 2018-10-26 20:41:12
回答 3查看 182关注 0票数 3

我可以获得一个类型,该类型表示接口的键:

代码语言:javascript
复制
interface I { a: string; b: string; }
const i: keyof I; // typeof i is "a" | "b"

是否有类似的方法来获得表示枚举值的类型?

代码语言:javascript
复制
enum E { A = "a", B = "b" }
const e: ?; // typeof e is "a" | "b"
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-11 19:43:28

模板文字操作符的帮助下,枚举的值列表可以被推断为一种类型:

代码语言:javascript
复制
enum E { A = "a", B = "b" }

type EValue = `${E}`
// => type EValue = "a" | "b"

const value: EValue = "a" // => ✅ Valid
const valid: EValue = "b" // => ✅ Valid
const valid: EValue = "" // =>  Invalid

参考文章:动态获取枚举的值。 (免责声明:作者在此)

票数 2
EN

Stack Overflow用户

发布于 2018-10-26 20:53:14

代码语言:javascript
复制
enum E { A = "a", B = "b" }
const e: keyof typeof E;

操场实例

票数 1
EN

Stack Overflow用户

发布于 2021-03-18 19:25:55

事实上,枚举的名称本身就是值类型的联合的别名。以下代码演示了:

代码语言:javascript
复制
enum WaterType {
    Lake  = 0,
    Ocean = 1,
    River = 2,
    Creek = 3,
};

let xxx: 0|1|2|3 = 2;
let yyy: WaterType = xxx; // OK
let zzz: 0|1|2|3 = yyy;   // OK

enum只是有点混乱,因为枚举的名称在某些上下文中引用类型(如0|1|2|3),但在其他上下文中,它以相同的名称引用对象。WaterType对象与此对象类似:

代码语言:javascript
复制
const WaterTypeObject = {
    Lake  : 0 as 0,
    Ocean : 1 as 1,
    River : 2 as 2,
    Creek : 3 as 3,
};

typeof WaterTypetypeof WaterTypeObject实际上是一样的

代码语言:javascript
复制
let aaa: typeof WaterType       = WaterType;
let bbb: typeof WaterTypeObject = aaa; // OK
let ccc: typeof WaterType       = bbb; // OK

在预期类型的上下文中,WaterType的意思是0|1|2|3,但您可以编写typeof WaterType以获得枚举对象的类型:

代码语言:javascript
复制
// VS code reports: type WaterTypeString = "Lake" | "River" | "Ocean" | "Creek"
type WaterTypeString = keyof typeof WaterType;
// VS code reports:   type WaterTypeNumbers = WaterType
// which really means type WaterTypeNumbers = 0|1|2|3
type WaterTypeNumbers = (typeof WaterType)[WaterTypeString];

请确保不要编写“Enum键”,例如,keyof WaterTypekeyof number是相同的,这肯定不是您想要的。

有趣的事实:keyof typeof WaterType是个谎言。WaterType的密钥实际上是"Lake"|"River"|"Ocean"|"Creek"|0|1|2|3 (例如WaterType["Creek"]==3WaterType[3]=="Creek")。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53016066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档