【发布时间】:2016-05-20 10:34:49
【问题描述】:
我正在尝试在 TypeScript 中声明一个简单的映射结构,其中包含字符串键和一些对象作为值。看了几个 StackOverflow 的答案,这就是我想出的:
class Person {
id: number;
name: string;
}
interface PersonMap {
[id: string]: Person;
}
当我尝试使用此声明时,TypeScript 将 PersonMap 解释为数组而不是地图,例如,我无法从地图中获取键或值:
let personMap = {} as PersonMap;
personMap[1] = {
id: 1,
name: 'John',
}
let people = personMap.values();
TypeScript 抱怨上面的最后一条语句:
Property 'values' does not exist on type 'PersonMap'
在 TypeScript 中声明 Map 的最佳方式是什么?
附:看起来 TypeScript 没有内置 ES6 Map 类型。无论如何,我想创建自己的 Map,而不是 ES6 地图。
【问题讨论】:
-
您是否对如何编写
values方法感到困惑,或者您是否想知道是否有一种方法可以在不编写values方法的情况下(不使用 ES6Map)? -
不写值方法——毕竟它是一个普通的旧对象。所以问题更多是关于如何声明对象以进行正确的类型检查。
-
除非您扩展
Object.prototype,否则您无法在没有方法的类型上获得values方法 - 您会考虑使用Object.keys(yourMap).map(key => yourMap[key])作为可接受的替代方法吗? -
不,目的是将 PersonMap 对象的属性值限制为 Person 类型。如果这在 TypeScript 中无法轻松完成,我宁愿保持简单并将 personMap 声明为
any,如下所示:let personMap: any = {}并完成! -
你的声明已经做到了as it currently stands
标签: typescript