使用地图的构造中打字稿与初始化值

问题描述:

的地图类型定义如下使用地图的构造中打字稿与初始化值

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

哪里的数据来自钥匙?他们只是基于数组的订单吗?

如果是这样......

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