我可以使用typescript将对象的键约束为枚举值吗?
我可以使用typescript将对象的键约束为枚举值吗?
实际上,我想要一种方法来确保选项参数的键是特定枚举值的值:
//枚举 Mode { Foo, Bar }; interface Mode { Foo: number, Bar: number } interface View { text: string; }; class FooView implements View { text = 'foo'; } class BarView implements View { text = 'bar'; } function initialize(options: { mode: {[P in keyof Mode]?: View} }) { let mode: View = options.mode.Foo; } initialize({ mode: { Bar: new FooView() } });
如果我使用接口/类而不是枚举,它可以完美运行,但这确实是一个枚举(在概念上)...
参见此处的示例。
问题的出现原因是因为在TypeScript中,对象的键必须是字符串或数字。然而,作者想要将对象的键限制为枚举的值。在代码中,通过使用方括号语法并将对象的键设置为数字来实现这一点。
然而,这种方法也存在一些问题。如上述代码中所示,虽然可以将枚举的值作为对象的键,但是用户仍然可以通过直接指定数字来绕过枚举限制,导致结果不如预期。为了解决这个问题,可以在运行时通过检查对象的键是否有效来抛出错误。
总结起来,问题的出现原因是因为TypeScript中对象的键不能直接限制为枚举的值。解决方法是通过使用方括号语法将对象的键设置为数字,并在运行时检查对象的键是否有效。这样可以部分地实现将对象的键限制为枚举的值。