首页 > 解决方案 > Typescript / ECMAScript 中的地图地图

问题描述

这是我个人认为在各种语言中正确的,但在这里不是。我一定对 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<string, string>() ?

第一个访问者的错误:this.aTask(this.myMap["key1"]);

元素隐式具有“任何”类型,因为类型“Map<string, Map<string, string>>”没有索引签名。你的意思是叫'get'吗?

第二个访问器的错误:this.aTask(this.myMap.get("key1"));

'Map<string, string> | 类型的参数 undefined' 不可分配给“Map<string, string>”类型的参数。类型 'undefined' 不可分配给类型 'Map<string, string>'。

标签: javascripttypescript

解决方案


Maps,尽管是对象,但不会将它们的值放在 Map 实例的属性中,这就是为什么this.myMap["key1"]不起作用的原因。

TypeScript 不允许你这样做

this.aTask(this.myMap.get("key1"));

因为.get不保证key存在于Map中;它警告你它可能已经返回undefined。为了类型安全,请执行以下操作:

async someWork() {
    const val = this.myMap.get("key1");
    if (val) {
        this.aTask(val);
    }
}

推荐阅读