在TypeScript中,Map<string, MyObject>和{[index: string]: MyObject}有什么区别?

5

如果我想在TypeScript中拥有带有类型检查的string:object字典,目前我知道有两种方法:

const m = new Map<string, MyObject>();
m.set("a", new MyObject("a"));
m.set("b", new MyObject("b"));

并且

const m : {[index: string]: MyObject} = {};
m["a"] = new MyObject("a");
m["b"] = new MyObject("b");

每种方法的优缺点是什么?如果还有另一种声明和使用字符串:MyObject字典的方法呢?
1个回答

2
正如this答案中详细说明的那样(在我的回答之前点赞!),在Typescript支持Map之前,一个具有类型键和值的对象(有时称为哈希表)是常用的:
const m : {[index: string]: MyObject} = {};

这种方法的问题在于键只能是字符串或数字类型,而实际上使用什么类型作为键类型并不重要,因为数字/字符串仍然可以互换使用(只有值被强制执行)。
Typescript现在原生支持ES6 Map类型,它没有上述关于键的任何缺点。至于哈希映射相对于Map的优势,我看不出来。
但是,如果您确实想通过索引运算符与(现在的遗留)Map类型交互,您可以通过将其包装在代理中来实现。
const map = new Map<string, number>();
// Set the value of "a" using Map's set function
map.set("a", 123);

const handler = {
    get: (target: Map<string, number>, name: string) => { return target.get(name)},
    set: (target: Map<string, number>, name: string, value: number) => {target.set(name, value)}
};
const mapWrapper = new Proxy(map, handler);

// Now add "b" to the Map with the value of 321 via the Proxy wrapper
mapWrapper["b"] = 321;

你可以在这里看到此示例运行。

有没有办法通过[]运算符使用Map? - lebed2045
1
@lebed2045,你可以通过将Map包装在JS代理中并使用[]运算符来使用它。这里是我写的一个例子。我同意JavaScript Map应该原生支持这个运算符。如果你想让我把它加到我的答案中,请告诉我(你可以说这应该是一个单独的问题)。 - Ben Smith
如果您能将此添加到答案中,我认为这对其他人会很有价值。 - lebed2045
@lebed2045 完成了! - Ben Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接