我可以使用typescript将对象的键约束为枚举值吗?

20 浏览
0 Comments

我可以使用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() } });

如果我使用接口/类而不是枚举,它可以完美运行,但这确实是一个枚举(在概念上)...

参见此处的示例

0
0 Comments

问题的出现原因是因为在TypeScript中,对象的键必须是字符串或数字。然而,作者想要将对象的键限制为枚举的值。在代码中,通过使用方括号语法并将对象的键设置为数字来实现这一点。

然而,这种方法也存在一些问题。如上述代码中所示,虽然可以将枚举的值作为对象的键,但是用户仍然可以通过直接指定数字来绕过枚举限制,导致结果不如预期。为了解决这个问题,可以在运行时通过检查对象的键是否有效来抛出错误。

总结起来,问题的出现原因是因为TypeScript中对象的键不能直接限制为枚举的值。解决方法是通过使用方括号语法将对象的键设置为数字,并在运行时检查对象的键是否有效。这样可以部分地实现将对象的键限制为枚举的值。

0