2017-02-10 6 views
0

基本的に、私はオプションの引数は、特定の列挙型の値であり、鍵を持っていることを確実にする方法をしたい:typescriptを使用してオブジェクトキーをenums値に制限できますか?

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

私はこれらの行に沿って考えていました。情報をありがとう! – Lucas

関連する問題