在打字稿中将枚举类型作为参数传递

Posted

技术标签:

【中文标题】在打字稿中将枚举类型作为参数传递【英文标题】:Passing enum type as parameter in typescript 【发布时间】:2020-06-22 12:01:40 【问题描述】:

我有一个函数:

public doSomethingWithEnum(enumType) 
   // Iterate over enum keys with Object.keys(enumType)

我可以这样使用它:

export enum MyEnum  SomeEnumValue = 'SomeEnumValue', SomeOtherValue = 'SomeOtherValue' 

doSomethingWithEnum(MyEnum);

没关系,它有效。问题是我想要那个参数的类型,所以我可以将它传递给任何枚举。目前,它也可能是:any,我认为这太开放了。

有没有办法限制/指定该参数的类型?

我的尝试

我知道可以通过列出已知类型来限制这一点,例如:

doSomethingWithEnum(enumType: MyEnum | MyOtherEnum)

但我需要它比这更具可扩展性,我不希望每次不同的消费者需要调用服务时都附加一个类型。

【问题讨论】:

你想限制什么?我会假设需要enumType: MyEnum,但显然你想要更广泛的东西。有多宽? 理想情况下,enum - 我知道这是不可能的。下一个最好的事情是什么?某种类型的字典,我在想。 VS 代码实际上试图为我推断一个类型,它想出了类似 [x: string]: string 但它不会运行(它不接受枚举)所以它不是一个类型可能需要一个枚举,但它促使我想到还有别的东西 任何枚举 = 任何对象 所以只需enumType: object @AlekseyL。 - object 是否比 any 更特定于枚举类型? 【参考方案1】:

枚举基本上是具有键/值对的对象,其中值是字符串或数字。因此,如果您想创建一个可以接受任何枚举的函数,您可以这样做:

enum Example 
    foo,
    bar
;

const doSomethingWithEnum = (en: Record<string, string | number>) => 
    Object.keys(en).forEach(key => console.log(key));


doSomethingWithEnum(Example);

这确实意味着您可以构造一个以字符串/数字作为键的非枚举对象并将其传递进去。

【讨论】:

感谢您的回答尼古拉斯!我刚刚尝试过并收到以下错误:Argument of type 'typeof ExampleEnum' is not assignable to parameter of type 'Record&lt;string, string&gt;'. Index signature is missing in type 'typeof ExampleEnum'. (注意:我省略了| Number,因为我使用的枚举是字符串值) 嗯,在发布我的答案之前,我在 typescript 操场上试用了该代码,它没有抱怨。您使用的是什么版本的打字稿? (typescriptlang.org/play/…) @JᴀʏMᴇᴇ 所以你应该尝试使用字符串枚举,这将工作typescriptlang.org/play/index.html#code/… @NicholasTower 它抱怨是因为 JayMee 删除了 | number 并且您的示例中的枚举将数字作为值

以上是关于在打字稿中将枚举类型作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

在打字稿中将 useState 作为道具传递

打字稿推断传递了通用参数

如何将实例变量传递给打字稿装饰器参数?

svg 组件的打字稿正确类型作为道具传递

打字稿类型定义 - 继承

如何在打字稿接口/类型中将枚举值类型转换为数组?