使用Typescript中的Map构造函数和初始化的值

tuwxkamq  于 2023-04-22  发布在  TypeScript
关注(0)|答案(2)|浏览(155)

Map的类型定义如下

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下面的问题,changeOptionsx 1 m8n1x中的number键是域中其他对象的标识符。
假设我有一个定义如下的Option类

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

给定Option示例的id将是changeOptionsMap的键。基于域的业务规则,存在有限的预定义Options集合。对于此问题,假设有3个Option示例,其id值为2, 10, 34,所以我希望这些是changeOptionsMap的键

m528fe3b

m528fe3b1#

这些数字是从哪里来的?它们仅仅是基于数组的顺序吗?
如果是的话...

let changeMaps = ...

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

实际上,您不再需要<number, ChangeMap>,因为由于as [number, ChangeMap],该表达式最终成为Array<[number, ChangeMap]>,但拥有它并没有什么坏处,而且它对文档很有好处。
分解一下:如果我们想要有一个可迭代的更改集传递到map构造函数中,我们需要将它们存储在一个集合中。这就是上面的changeMaps,...是供您按照自己的意愿填写的。只有一个项的朴素形式就是[changeMap]。然后我们将该集合Map到元组集合,包括索引。我使用i+1是因为看起来你想从数字1开始。这就是传入map构造函数的内容。

fcg9iug3

fcg9iug32#

语法为:

let changeOptions = new Map<number, ChangeMap>([[2, changeMap], [10, anotherChangeMap], [34, thirdChangeMap]]);

相关问题