在TypeScript中使用什么代替Object.assign

在TypeScript中使用什么代替Object.assign,typescript,Typescript,我在源代码中使用映射类型,并在整个项目中重用该类型: type StringUnion = string | string[]; type StringUnionMap = { [key: string]: StringUnion }; 我必须将其中两个地图合并为一个包含以下两个项目的地图: let map1: StringUnionMap = { "key1": "value1", "key2": "value2" }; let map2: StringUnionMap = { "key3"

我在源代码中使用映射类型,并在整个项目中重用该类型:

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];
}
我觉得这种方式有点笨拙和冗长。有没有更简洁的方法来组合我的两张地图

我尝试过这个方法,但无法编译Transfile:

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

相应的方法不起作用,因为我在启用
noImplicitAny
的情况下瞄准ES5。因此。

Typescript并没有提供这样的功能,但javascript有一个功能,可以实现您所需要的功能:

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 = Object.assign({}, map1, map2);
console.log(combinedMap); // Object {key1: "value1", key2: "value2", key3: Array[2]}

()

Typescript没有提供这样的功能,但是javascript有一个功能,它可以实现您所需要的功能:

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 = Object.assign({}, map1, map2);
console.log(combinedMap); // Object {key1: "value1", key2: "value2", key3: Array[2]}

()

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

生成的代码将使用
对象。如果可用,则分配
函数,或者提供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);
var uu assign=(this&&this.u assign)| | Object.assign | |函数(t){
for(var s,i=1,n=arguments.length;i
Typescript 2.1允许您使用以下语法合并对象:

生成的代码将使用
对象。如果可用,则分配
函数,或者提供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);
var uu assign=(this&&this.u assign)| | Object.assign | |函数(t){
for(var s,i=1,n=arguments.length;i
为什么称这些为“地图”?它们是物体。还有,为什么你认为这与打字脚本有关?TypeScript不是语言,它只是一个类型层。这只是一个常见的老JS(或ES6)问题。可能是冷静的重复。请参考答案,其中建议
对象。分配
或其等效项,这是一个纯ES6结构。这不是“我想叫它”的方式。每个人都这么称呼它,因为这是正确的称呼。还有一个更好的理由不把你拥有的东西称为“map”,因为“map”在JS世界中有一个非常特殊的含义(是的,它是JS),这是一个类型为
map
的值。无论如何,您的“构造”确实存在于JS中。您所做的只是将TS类型应用于JS对象,这不会改变它是JS对象的事实。我建议你回去仔细研究TS在语言生态系统中的作用。从这个问题的前一个版本:是否为我提供了一种更简洁的方式来组合我的两个地图?TypeScript不提供新的语言功能或新功能。它是ES6,再加上选定的ES7+功能,这些功能在TC39过程中足够先进,并且可以键入。它添加了新语法,但新语法严格限于指定和处理键入信息。它知道如何传输到ES3/ES5/ES6,但在这方面与巴别塔是相同的——但没有人会说巴别塔是一种语言。它采用JS的一种形式,并将其转换为另一种形式。你为什么称这些为“映射”?它们是物体。还有,为什么你认为这与打字脚本有关?TypeScript不是语言,它只是一个类型层。这只是一个常见的老JS(或ES6)问题。可能是冷静的重复。请参考答案,其中建议
对象。分配
或其等效项,这是一个纯ES6结构。这不是“我想叫它”的方式。每个人都这么称呼它,因为这是正确的称呼。还有一个更好的理由不把你拥有的东西称为“map”,因为“map”在JS世界中有一个非常特殊的含义(是的,它是JS),这是一个类型为
map
的值。无论如何,您的“构造”确实存在于JS中。您所做的只是将TS类型应用于JS对象,这不会改变它是JS对象的事实。我建议你回去仔细研究TS在语言生态系统中的作用。从这个问题的前一个版本:是否为我提供了一种更简洁的方式来组合我的两个地图?TypeScript不提供新的语言功能或新功能。它是ES6,再加上选定的ES7+功能,这些功能在TC39过程中足够先进,并且可以键入。它添加了新语法,但新语法严格限于指定和处理键入信息。它知道如何传输到ES3/ES5/ES6,但在这方面与巴别塔是相同的——但没有人会说巴别塔是一种语言。它采用JS的一种形式,并将其转换为另一种形式。为什么“差不多”?这不是“完全正确”吗?我试过这个选项,但它不起作用<代码>对象。分配
不会验证类型的完整性。明白为什么“差不多”?这不是“完全正确”吗?我试过这个选项,但它不起作用<代码>对象。分配
不会验证类型的完整性。看见