【问题标题】:How to declare a Map in TypeScript?如何在 TypeScript 中声明地图?
【发布时间】: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 方法的情况下(不使用 ES6 Map)?
  • 不写值方法——毕竟它是一个普通的旧对象。所以问题更多是关于如何声明对象以进行正确的类型检查。
  • 除非您扩展 Object.prototype,否则您无法在没有方法的类型上获得 values 方法 - 您会考虑使用 Object.keys(yourMap).map(key => yourMap[key]) 作为可接受的替代方法吗?
  • 不,目的是将 PersonMap 对象的属性值限制为 Person 类型。如果这在 TypeScript 中无法轻松完成,我宁愿保持简单并将 personMap 声明为 any,如下所示:let personMap: any = {} 并完成!
  • 你的声明已经做到了as it currently stands

标签: typescript


【解决方案1】:

您尝试过 Map 对象吗?

let personMap = new Map()

map.set("1234", person1)
map.set("4567", person2)

map.get("1234")   =>  person1

行内声明:

export const Person Map = new Map([
  ["1234", person1],
  ["5678", person2]
])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2012-12-31
    • 2012-10-25
    • 2021-09-19
    • 2018-04-18
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多