在TypeScript中使用什么而不是Object.assign

时间:2016-12-14 14:23:00

标签: typescript

我在我的来源中使用了一个映射类型,我在整个项目中都在重复使用:

type StringUnion = string | string[];
type StringUnionMap = { [key: string]: StringUnion };

我必须将其中两张地图合并为一张包含两者条目的地图:

let map1: StringUnionMap = { "key1": "value1", "key2": "value2" };
let map2: StringUnionMap = { "key3": [ "value3a", "value3b" ] };

我当然可以在这样的循环中实现我想要的东西:

let combinedMap: StringUnionMap = {};
for (let key in map1) {
    combinedMap[key] = map1[name];
}
for (let key in map2) {
    combinedMap[key] = map2[name];
}

我发现这种方式有点笨拙和冗长。有没有更简洁的方法来组合我的两张地图?

我试过这个,但那不是 compile transpile:

let combinedMap: StringUnionMap = new StringUnionMap( [ map1, map2 ] );

相应的JavaScript solution with Object.assign不起作用,因为我在启用noImplicitAny的情况下定位ES5。因此Object.assign is not available to me

2 个答案:

答案 0 :(得分:3)

Typescript 2.1允许您使用spread语法合并对象:

let combinedMap: StringUnionMap = {...map1, ...map2};

生成的代码将使用Object.assign函数(如果可用)或提供polyfill:

var __assign = (this && this.__assign) || Object.assign || function(t) {
    for (var s, i = 1, n = arguments.length; i < n; i++) {
        s = arguments[i];
        for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
            t[p] = s[p];
    }
    return t;
};
var map1 = { "key1": "value1", "key2": "value2" };
var map2 = { "key3": ["value3a", "value3b"] };
var combinedMap = __assign({}, map1, map2);

答案 1 :(得分:0)

Typescript并没有为你提供这样的功能,但是javascript具有Object.assign功能,它可以完成你正在寻找的功能:

requirements = kivy,python3crystax

code in playground