【问题标题】: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 更特定于枚举类型?

标签: typescript types enums parameters


【解决方案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 并且您的示例中的枚举将数字作为值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
相关资源
最近更新 更多