我可以使用打字稿将对象键限制为枚举值吗?
Posted
技术标签:
【中文标题】我可以使用打字稿将对象键限制为枚举值吗?【英文标题】:Can I constrain an objects keys to an enums values using typescript? 【发布时间】:2017-06-29 09:00:28 【问题描述】:本质上,我想要一种方法来确保选项参数具有作为特定枚举值的键:
//enum 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() );
如果我使用接口/类而不是枚举,它会完美运行,但这确实是一个枚举(概念上)......
见this playground
【问题讨论】:
【参考方案1】:键必须是字符串或数字。您可以这样做,但您必须使用括号语法并将对象的键设置为数字:
enum Mode Foo, Bar ;
function initialize(options: mode: [key:number]: View )
let mode: View = options.mode[Mode.Foo];
initialize( mode: [Mode.Bar]: new FooView() );
这个答案的想法来自Sohnee的answer to a similar question。
显然这里的警告是有人可以很容易地做类似的事情
initialize( mode: [999]: new FooView() );
低于最佳值。如果该值不是有效的模式,你可以做的最好的事情是在运行时抛出一个错误:
if (!Object.keys(options.mode).every((key) => key in Mode))
throw new Error("Nice try");
【讨论】:
我是按照这些思路思考的……绝对不是最佳的。感谢您的信息!以上是关于我可以使用打字稿将对象键限制为枚举值吗?的主要内容,如果未能解决你的问题,请参考以下文章