Map<String,String> Dart 在 Typescript 中的等价物?

Luk*_*tti 9 typescript typescript-typings

我试图Map<String, String>在 Dart 中找到一个等价物,但可以在 Typescript 中使用。这是定义 string:string key:value 存储的快速方法。

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

Map<String, List<String>>

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

在打字稿中有什么办法吗?

Ebu*_*all 17

如果键只是字符串,您可能更喜欢在 TypeScript 中使用普通对象,您可以将其键入为Record<string, string>.
示例用法


Dan*_*ker 15

打字稿等价物将是:

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

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

你可以说,Array<string>但这可能不太广泛使用。

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

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

const m: StringToArrayOfStrings = {};
m["fruit"] = ["apple", "banana"];
Run Code Online (Sandbox Code Playgroud)

type声明中,我们声明了索引操作符的签名[...]。(可以有数字键和字符串键。)

更新

仍然使用普通对象作为映射,请注意,我们不必使用type声明来为类型命名。类型声明可以就地替换,然后我们可以立即m使用兼容对象进行初始化:

const m: { [name: string]: string[] } = {
    "fruit": ["apple", "banana"],
    "spaceship": ["orion", "apollo"]
};
Run Code Online (Sandbox Code Playgroud)

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

const m = {
    "fruit": ["apple", "banana"],
    "spaceship": ["orion", "apollo"]
};
Run Code Online (Sandbox Code Playgroud)

那么m推断出的类型更具限制性:

{
    fruit: string[];
    spaceship: string[];
}
Run Code Online (Sandbox Code Playgroud)

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