javascript - Typescript/ECMAScript 中的嵌套 Map
这是我个人认为在各种语言中是正确的,但在这里却不是。我一定是对 TypeScript 的某个方面不了解,但我无法轻易确定差距在哪里。
该实现需要一个映射的映射。顶层映射是字符串键,而内部映射是字符串键和值的映射。
class aClass
{
myMap: Map<string, Map<string, string>>;
constructor ()
{
this.myMap = new Map<string, Map<string, string>>([
["key1", new Map<string,string>()],
["key2", new Map<string,string>()]
]);
}
async aTask(map: Map<string,string>)
{
map.set("subKey1", "VALUE");
}
async someWork()
{
this.aTask(this.myMap["key1"]);
this.aTask(this.myMap.get("key1"));
}
}
我如何在函数 someWork() 中正确访问 Map
第一个访问器的错误:this.aTask(this.myMap["key1"]);
元素隐式具有 'any' 类型,因为类型 'Map
第二个访问器的错误:this.aTask(this.myMap.get("key1"));
类型为 'Map<string, string> | undefined' 的参数不可分配给类型 'Map<string, string>' 的参数。类型 'undefined' 不能分配给类型 'Map<string, string>'。
答案#1
尽管 Map 是对象,但它们不会将自身的值放到 Map 实例的属性上,这就是为什么 this.myMap["key1"] 不起作用的原因。
TypeScript 不允许你做
this.aTask(this.myMap.get("key1"));
因为 .get 并不保证 Map 中存在该键;它在警告你,它可能返回 undefined。为了类型安全,可以这样做:
async someWork() {
const val = this.myMap.get("key1");
if (val) {
this.aTask(val);
}
}
