网站搜索

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>' 没有索引签名。你是想调用 'get' 吗?

第二个访问器的错误: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);
    }
}