问题是可以将枚举用作键类型,而不仅仅是"数字"或"字符串" ?目前似乎唯一可能的声明是x:{[key:number]:any}其中key可以是" number"或"字符串"。是否有可能在这个例子中做出类似的东西:
示例:
enum MyEnum
{
First,
Second
}
var layer:{[key:MyEnum]:any};
答案 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>>;
:)