2017-06-30 8 views
0

オブジェクトマップの値を特定の型に制限し、そのキーを列挙できるようにしたい。Typescript:制限付きの列挙可能なプロパティを持つマップオブジェクトの定義

は持つ:

const obj = { 
    a: 'a', 
    b: 'b' 
} 

type Obj = typeof obj 

const obj2: Obj 

OBJ2がab小道具

を入力した。しかし、私は文字列だけであることをOBJ小道具を制限したい、私は今、NOを持ってobj2が

const obj: {[name: string]: string} = { 
    a: 'a', 
    b: 'b' 
} 

type Obj = typeof obj 

const obj2: Obj 

を行うことができます型付きの小道具、ちょうどインデックス付きの文字列プロパティ、しかしそれはabの小道具しか持たず、 NT行うには、明示的にキータイプ(多分私は列挙する2つのab小道具その後、多くを持っているので)列挙:

const obj: {[name in ('a' | 'b')]: string} = { 
    a: 'a', 
    b: 'b' 
} 

type Obj = typeof obj 

const obj2: Obj 

をこれを達成することはできますか?簡略化して最後のスニペット

答えて

1

だから基本的にいいえ。これは不可能です。

type Indexer = {[name: string]: string}; 
type Obj = {a: string, b: string}; 
obj: Obj = {a: 'a', b: 'b'} 

// Lodash map 
_.map(<Indexer> obj, (val, key) => {}) 

注:

あなたがインデクサーを使用しない場合、私はより合理的な解決策は、あなたが望むように制限タイプを定義し、必要なときにインデクサー型にキャストすることができていることがわかり

type Obj = {a: string, b: string, [name: string]: string}} 
0123:あなたはこの懸念を持っていない場合、彼らは型の安全性を破るために、この問題に関するオープンな議論はこの issue

にありますが、単純にこのようなあなたのタイプを定義することができます

関連する問題