2017-02-10 64 views
0

從本質上講,我想辦法,以確保一個選項參數有哪些是特定的枚舉值鍵:我可以使用typescript將一個對象鍵約束到一個枚舉值嗎?

//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

回答

0

密鑰必須是字符串或數字。你可以種做到這一點,但你必須用括號語法,並設置多項您的對象的關鍵:

enum Mode { Foo, Bar }; 

function initialize(options: { mode: {[key:number]: View} }) { 
    let mode: View = options.mode[Mode.Foo]; 
} 

initialize({ mode: { [Mode.Bar]: new FooView() } }); 

此答案的想法來自Sohneeanswer to a similar question

顯然,這裏需要說明的是,有人可以很容易地做一些這樣

initialize({ mode: { [999]: new FooView() } }); 

不再是最理想的。你能做的最好有在運行時拋出一個錯誤,如果值不是一個有效的模式:

if (!Object.keys(options.mode).every((key) => key in Mode)) { 
    throw new Error("Nice try"); 
} 
+0

我沿着這些線路想......比optimal_肯定_less。謝謝(你的)信息! – Lucas

相關問題