如何在TypeScript中合并两个Maps

Nic*_*ick 6 typescript

我想合并2个地图.在ES6中,我会这样做,它完全正常:

const m1 = new Map();
m1.set('foo', 1);

const m2 = new Map();
m2.set('bar', 3);

const m3 = new Map([...m1, ...m2]);
Run Code Online (Sandbox Code Playgroud)

如果我在TS中执行相同操作,则会出现以下错误:

Type 'Map<string, number>' is not an array type.
Run Code Online (Sandbox Code Playgroud)

我假设我必须以某种方式将它投射到数组,但我没有找到一个有效的解决方案.我该如何解决这个问题呢?

Red*_*cer 8

这也适用于目标ES5:

let map1:Map<string, number> = new Map([["a", 1], ["b", 2]]);
let map2:Map<string, number> = new Map([["c", 1], ["d", 2]]);

let mergedMap:Map<string, number> = new Map([...Array.from(map1.entries()), ...Array.from(map2.entries())]);
Run Code Online (Sandbox Code Playgroud)


Luc*_*ier 7

这是一个简短的语法:

const map1 = new Map([["a", 1], ["b", 2]])
const map2 = new Map([["c", 1], ["d", 2]])

const mergedMaps = new Map([...map1.entries(), ...map2.entries()])
Run Code Online (Sandbox Code Playgroud)


Tit*_*mir 5

如果将es5作为Typescript编译的目标,则会出现此错误。如果可以,则应将es2015作为Typescript编译的目标,然后该错误将不会出现(例如,在tsconfig.json中):

{
    "compilerOptions": {
        "target": "es2015"
    }
}
Run Code Online (Sandbox Code Playgroud)

散布运算符仅适用于ES6模式下的“地图集”。https://github.com/Microsoft/TypeScript/issues/8856#issuecomment-222879485这是因为它忽略了传播运算符,并且按原样输出。换句话说,TypeScript不会为Map / Set传递价差。