我可以使用打字稿将对象键限制为枚举值吗?

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");

【讨论】:

我是按照这些思路思考的……绝对不是最佳的。感谢您的信息!

以上是关于我可以使用打字稿将对象键限制为枚举值吗?的主要内容,如果未能解决你的问题,请参考以下文章

在打字稿中使用枚举作为接口键

使用打字稿将文件上传到控制器

为啥打字稿将联合中的属性标记为不存在?

使用打字稿将其他菜单元素插入到特定位置

打字稿将联合转换为交集[重复]

打字稿将数组转换为 JSON