在Typecript中使用Enum作为受限密钥类型

时间:2017-05-29 12:55:45

标签: typescript

问题是可以将枚举用作键类型,而不仅仅是"数字"或"字符串" ?目前似乎唯一可能的声明是x:{[key:number]:any}其中key可以是" number"或"字符串"。是否有可能在这个例子中做出类似的东西:

示例:

enum MyEnum
{
    First,
    Second
}

var layer:{[key:MyEnum]:any};

5 个答案:

答案 0 :(得分:23)

Since 2018,Typescript 中有更简单的方法,无需使用 keyof typeof

let layer: { [key in MyEnum]: any}

不必包含所有键:

let layer: { [key in MyEnum]?: any}

答案 1 :(得分:18)

是。只需输入

即可
let layer:{[key in keyof typeof MyEnum]: any}

自Typecript 2.1起,keyof关键字可用。有关详细信息,请参阅TypeScript documentation。 仅对枚举使用keyof不起作用(您将获得enum类型的键而不是枚举常量),因此您必须键入keyof typeof

答案 2 :(得分:4)

对于那些寻求获得keys中的enum而不是其value的人来说,您只需要对此进行更改:

type myType = Partial<Record<MyEnum, number>>;

对此:

type myType = Partial<Record<keyof typeof MyEnum, number>>;

答案 3 :(得分:2)

实际上它对我有用,没有任何解决方法。

这里是一些情况:

enum EnumString {
  a="a",
  b="b"
}

enum EnumNum {
  a,
  b
}

type Type = "a" | "b"


let x1:{[k in EnumString]?:any }={a:1} //working
let x2:{[k in EnumNum]?:any }={a:1} //error: Type '{ a: number; }' is not assignable to type '{ 0?: any; 1?: any; }'
let x3:{[k in Type]?:any }={a:1} //working; defining a union type is easer than defining an enum string 

let y1:{[k: EnumString]?:any }={a:1}
let y2:{[k: EnumNum]?:any }={a:1}
let y3:{[k in Type]?:any }={a:1}

let z1:{[k in keyof typeof EnumString]?:any }={a:1}
let z2:{[k in keyof typeof EnumNum]?:any }={a:1}
let z3:{[k: keyof typeof Type]?:any }={a:1}

需要注意的是“z1”这个例子,即使它运行良好,但你以后不能修改它,因为它是只读的。您可以使用关键字 -readonly 删除此限制。

x1.a=2 
x3.a=2
z1.a=2 //error: read only

我创建了一个 typescript playground 来自己查看不同案例的问题

答案 4 :(得分:1)

简短答案:

let layer: Partial<Record<MyEnum, any>>;

详细答案(详细信息):

我有同样的问题。我想完成以下代码。

enum MyEnum {
    xxx = "xxx",
    yyy = "yyy",
    zzz = "zzz",
}

type myType = ...; // Fill here

const o: myType = { // keys should be in MyEnum, values: number
   [MyEnum.xxx]: 2,
   "hi": 5, // <--- Error: complain on this one, as "hi" is not in enum
}

o[MyEnum.yyy] = 8; // Allow it to be modified later

从这个问题的other answer开始,我去了:

type myType = {[key in keyof typeof MyEnum]: number};

但是它会na o is missing "yyy"。因此,我需要告诉它该对象将具有一些枚举键,而不是全部。所以我必须添加?来获得:

type myType = {[key in keyof typeof MyEnum]?: number};

一切正常,直到我在代码末尾添加一行以在对象首次创建后对其进行修改。现在,它抱怨通过keyof继承的类型的属性为readonly,在第一次创建后我无法触摸它们! :|实际上,将鼠标悬停在Typescript Playground中的myType上将显示为:

type myType = {
    readonly xxx?: number | undefined;
    readonly yyy?: number | undefined;
    readonly zzz?: number | undefined;
}

现在,要删除不需要的readonly,我发现我可以使用:

type myType = {-readonly [key in keyof typeof myEnum1]?: number };

十分丑陋,但有效

直到我玩过打字稿Utility Types,然后找到了我想要的!

type myType = Partial<Record<MyEnum, number>>;

:)