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)
?@OscarPaz
fn(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