【发布时间】:2017-04-29 22:06:37
【问题描述】:
我在我的 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];
}
我觉得这种方式有点笨拙和冗长。有没有更简洁的方法来组合我的两张地图?
我已经尝试过了,但这并不能编译转译:
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