2016-09-29 107 views
3

的地圖類型定義如下使用地圖的構造中打字稿與初始化值

interface MapConstructor { 
    new <K, V>(): Map<K, V>; 
    new <K, V>(iterable: IterableShim<[K, V]>): Map<K, V>; 
    prototype: Map<any, any>; 
} 

我想用第二個構造new <K, V>(iterable: IterableShim<[K, V]>): Map<K, V>;

我有一個類型,我定義type ChangeMap = { [key: string]: Array<string> };這是用來如下

let changeMap: ChangeMap = { A: ["Car", "Boat"], B: ["Plane", "Rocket"] }; 

我想創建一個Map<number, ChangeMap>,我可以做的很輕鬆了,但我堅持爲如何構建數據我想初始化我Map

public changeOptions = new Map<number, ChangeMap>(... what goes here ... ?) 

這是可能的,或者我需要初始化我Map沒有價值,然後調用changeOptions.set(1, changeMap);給它值?

---編輯#1

要回答下面@ Paarth的問題,在changeOptionsMapnumber鍵用於域中的其他對象標識符。

假設我有一個類定義的選項,如下所示

class Option { 
    id: number; 
    name: string; 
} 

給定Option實例的id是爲changeOptionsMap的關鍵。根據域的業務規則,有限的預定義集合Options。假設對於該問題有3分Option2, 10, 34id值的情況下,所以我想這些是的changeOptionsMap

+1

數字(您設置的電話中的第一個參數)來自哪裏? – Paarth

+0

@Paarth「changeOptions」Map「的數字鍵是域中其他對象的ID。根據該ID我想要使用不同的'ChangeMap' – seangwright

回答

1

哪裏的數據來自鑰匙?他們只是基於數組的訂單嗎?

如果是這樣......

let changeMaps = ... 

public changeOptions = new Map<number, ChangeMap>(changeMaps.map((v,i) => [i+1,v] as [number, ChangeMap])); 

你實際上並不需要<number, ChangeMap>了,因爲表達式最終爲一個Array<[number, ChangeMap]>感謝as [number, ChangeMap]但它不會傷害有和它的良好的文檔。

分解:如果我們想要一組迭代的變化傳入地圖構造函數,我們需要將它們存儲在一個集合中。這是changeMaps以上,...是給你填寫你想要的。一個項目的天真形式只是[changeMap]。然後我們將這個集合映射到一系列元組,包括索引。我使用i+1,因爲它看起來像你想從數字1開始。這就是傳遞給地圖構造函數的東西。

+0

我不能使用自動遞增索引,如我在問題中編輯#1所述 – seangwright