【问题标题】:What to use instead of Object.assign in TypeScript在 TypeScript 中使用什么代替 Object.assign
【发布时间】:2017-04-29 22:06:37
【问题描述】:

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

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];
}

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

我已经尝试过了,但这并不能编译转译:

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

各自的JavaScript solution with Object.assign 不起作用,因为我的目标是 ES5 并打开了noImplicitAny。因此Object.assign is not available to me

【问题讨论】:

  • 你为什么称这些“地图”?它们是对象。另外,为什么你认为这与 TypeScript 相关? TypeScript 不是语言,它只是一个类型层。这只是普通的旧 JS(或 ES6)问题。
  • 冷静下来。请查阅答案,其中建议 Object.assign 或其等价物,这是一个纯 ES6 构造。
  • 这不是“我想这样称呼它”。 每个人都是这样称呼它的,因为这是正确的称呼方式。有一个更好的理由不称你有“地图”,因为“地图”在 JS 世界中具有极其特殊的含义(是的,它 JS),它的值是输入Map。无论如何,您的“构造”确实存在于 JS 中。您所做的只是将 TS 类型应用于 JS 对象,这不会改变它是 JS 对象的事实。建议你回去仔细研究一下 TS 在语言生态系统中的作用。
  • 从这个问题的先前版本:typescript 是否为我提供了一种更简洁的方式来组合我的两个地图? TypeScript 没有提供新的语言特性或新功能。它是 ES6,加​​上在 TC39 流程中足够先进的选定 ES7+ 功能,带有打字功能。它添加了新语法,但新语法严格限于指定和处理类型信息。它知道如何转换为 ES3/ES5/ES6,但在这方面与 Babel 相同——但没有人会说 Babel 是一种语言。它采用一种形式的 JS 并将其转译成另一种形式。

标签: typescript typescript


【解决方案1】:

Typescript 没有提供这样的功能,但 javascript 具有 Object.assign 函数,它几乎可以满足您的需求:

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]}

(code in playground)

【讨论】:

【解决方案2】:

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2020-04-11
    • 2018-08-29
    • 2013-12-03
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多