在打字稿中将枚举类型作为参数传递
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<string, string>'. Index signature is missing in type 'typeof ExampleEnum'.
(注意:我省略了| Number
,因为我使用的枚举是字符串值)
嗯,在发布我的答案之前,我在 typescript 操场上试用了该代码,它没有抱怨。您使用的是什么版本的打字稿? (typescriptlang.org/play/…)
@JᴀʏMᴇᴇ 所以你应该尝试使用字符串枚举,这将工作typescriptlang.org/play/index.html#code/…
@NicholasTower 它抱怨是因为 JayMee 删除了 | number
并且您的示例中的枚举将数字作为值以上是关于在打字稿中将枚举类型作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章