Typescript中枚举的类型是什么?
给定一个函数,该函数的参数应为Typescript中枚举的类型是什么?,typescript,typescript-typings,Typescript,Typescript Typings,给定一个函数,该函数的参数应为enum。传入的enum可以具有不同数量的属性。如何修正该参数的类型枚举本身不是类型 例如: function (myEnum: mysteriousType){ //What is that mysteriousType ? } 用例是构建一个通用方法来实例化枚举中的选项,无论枚举中的字符串/数字类型是什么。根据您到目前为止所述的内容(需要接受所有字符串/数字/异构枚举),我能做的最接近的事情如下所示: type Enum<E> = Recor
enum
。传入的enum
可以具有不同数量的属性。如何修正该参数的类型<代码>枚举本身不是类型
例如:
function (myEnum: mysteriousType){
//What is that mysteriousType ?
}
用例是构建一个通用方法来实例化枚举中的选项,无论枚举中的字符串/数字类型是什么。根据您到目前为止所述的内容(需要接受所有字符串/数字/异构枚举),我能做的最接近的事情如下所示:
type Enum<E> = Record<keyof E, number | string> & { [k: number]: string };
function acceptEnum<E extends Enum<E>>(
myEnum: E
): void {
// do something with myEnum... what's your use case anyway?
}
enum E { X, Y, Z };
acceptEnum(E); // works
语言设计者可能进一步限制了这一点,因为反向映射只会产生正向映射中看到的特定数字键和字符串值,但由于某些原因,它的实现不是这样的:
const doesntWork: { X: 0, Y: 1, Z: 2, [k: number]: 'X' | 'Y' | 'Z' } = E; // error
const alsoDoesntWork: { X: 0, Y: 1, Z: 2, 0: 'X', 1: 'Y', 2: 'Z' } = E; // error
因此,我可以对枚举类型施加的最严格的约束是上面的E extends enum
请注意,此代码不适用于运行时不存在的
const enum
类型:
const enum F {U, V, W};
acceptEnum(F); // nope, can't refer to `F` by itself
还要注意,上面的类型(E extensed Enum
)允许一些它可能不应该允许的事情:
acceptEnum({ foo: 1 }); // works
在上面的例子中,{foo:1}
似乎是一个类似于enum foo{foo=1}
的数字枚举,但它没有反向映射,如果依赖于此,那么在运行时事情会崩溃。请注意,{foo:1}
似乎没有索引签名,但它仍然与索引签名匹配。除非您添加了一些明确的错误值,否则它不会失败:
acceptEnum({foo: 1, 2: 3}); // error, prop '2' not compatible with index signature
但是这里没有什么可以做的。如上所述,enum
类型化的实现目前没有尽可能多地约束数字键,因此在编译时似乎无法区分具有良好反向映射的enum和没有反向映射的enum
希望有帮助。祝你好运 是吗?你的意思是如何声明一个函数,它接受任何枚举的任何值,或者枚举作为一个对象?我的意思是,给定
enum myEnum{1,2,3}
如何调用函数<代码>fn(myEnum)?或者fn(myEnum.one)
?@OscarPazfn(myEnum)
。但这也适用于fn(anyOtherRandomEnum)
。您希望它仅适用于数字枚举还是字符串枚举?还是混合的?@crashmstr似乎我没读那部分。如果我们首先定义数字和字符串枚举的类型,那么“运行时枚举”一段应该会回答这个问题。感谢您的详细快速回答和深入调查。暂时标记为正确的。我很惊讶没有简单的方法,因为枚举对象本身不容易处理。这个用例是一个循环遍历枚举属性的函数,这已经够复杂了,在这个用例中只传递enum
。你能举个例子,说明在接口中使用emum作为泛型类型吗?你能解释一下“&{[k:number]:string};”是什么吗我不明白你的第一个问题。。。我不是那个想用这种方式使用枚举的人,所以我不确定这个例子应该是什么。至于第二个问题,它意味着Enum
应该有数值为字符串的数字键,以表示枚举的反向映射。type Enum=Record&{[k:number]:keyof E}
可以更精确,但没有多大区别
acceptEnum({foo: 1, 2: 3}); // error, prop '2' not compatible with index signature