Map <string,string> Dart在Typescript中是否等效?

时间:2018-09-28 21:01:56

标签: typescript typescript-typings

我正在尝试在Dart中找到与Map<String, String>等效的方法,但可以在Typescript中使用。这是定义string:string键:value存储的快速方法。

另外,可以这样使用,这是我的下一个问题:

Map<String, List<String>>

这将定义一个key:value存储,其中的键是字符串,值是字符串列表。

在Typescript中有什么方法可以做吗?

3 个答案:

答案 0 :(得分:3)

等效的打字稿为:

const m = new Map<string, string[]>();
m.set("fruit", ["apple", "banana"]);

请注意,string[]是“字符串数组”类型,尽管其名称是可动态增长的字符串列表(与许多流行的静态类型语言中的固定长度数组不同)。

您可以改为说Array<string>,但这可能使用得不太广泛。

如果您的密钥是字符串,则可能会发现使用JS对象更为方便。 JS中的对象基本上是带有字符串键的映射。在TS中,示例变为:

type StringToArrayOfStrings = { 
    [name: string]: string[] 
};

const m: StringToArrayOfStrings = {};
m["fruit"] = ["apple", "banana"];

type声明中,我们声明索引运算符[...]的签名。 (既可以有数字键也可以有字符串键。)

更新

仍然使用普通对象作为地图,请注意,我们不必使用type声明来为类型指定名称。类型声明可以就地替换,然后我们可以立即使用兼容的对象初始化m

const m: { [name: string]: string[] } = {
    "fruit": ["apple", "banana"],
    "spaceship": ["orion", "apollo"]
};

请注意,如果我们省略m上的类型批注:

const m = {
    "fruit": ["apple", "banana"],
    "spaceship": ["orion", "apollo"]
};

然后推断出m的类型更加严格:

{
    fruit: string[];
    spaceship: string[];
}

编译器将假设我们的意思是m永久停留在fruitspaceship这两个属性中,并且不允许我们添加更多属性。有趣的是,它不会假设任何有关数组长度的信息(即使有可能通过元组类型在TS中描述这种情况)。

答案 1 :(得分:1)

Typescript是Javascript的超集,具有built-in Map class。这可以采用任何键/值对,包括String, List<String>。嗯,JS中没有List类型,但是您可以改用Array

答案 2 :(得分:1)

如果键只是字符串,则您可能希望在TypeScript中使用纯对象,可以将其键入为Record<string, string>
Example usage