如何在typescript中声明Map类型?

29
我想声明一个像这样的类型:

我想声明一个像这样的类型:

interface DependData {[key: string]: string};

但是出现了这样的错误:

Statements are not allowed in ambient contexts

3
这是一个对象声明,而不是Map。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map - Nazar Hussain
3
如果有人偶然看到这个答案寻找 JS 中的 Map 数据结构,你可以通过以下方式为键值对指定类型:let m = new Map<type1, type2>(); - EternalObserver
2个回答

48
你描述的错误信息出现在一个声明文件中。
为了让它正常工作,你需要删除接口声明末尾的分号。
interface DependData {
    [key: string]: string;
}

额外的分号导致了一个空语句被解析,除了接口声明之外,从而导致该错误消息。请注意保留原文中的符号。

1
另外,对于那些需要枚举键的人,[key in YourEnumType] 语法应该会有所帮助。干杯! - no id
我尝试过了,它对我没用。无法实例化地图。它设置了一个名为 StringNumberKVP 的接口,其中[key:string]:boolean。 我尝试实例化映射。 预编译器返回:类型 'Map <string,number>' 无法分配给类型 'StringNumberKVP'。 索引签名在类型 'Map <string,number>' 中丢失。 - Luc-Olivier
1
以上代码将如下创建:const data: DependData = {};(请注意,上面的问题实际上是在询问为什么他们无法声明索引访问类型) - David Sherret
@Luc-Olivier 这是一个不同的问题。你知道 Map<string, number> 这种类型,因为你刚才说了它。这个问题是关于当你使用一个 Object(比如来自 { these: 'literals' } 的对象)及其属性作为映射时的情况。无论属性名是什么,你都可以告诉 TypeScript 每个属性的类型。 - doug65536
@doug65536 已经明白了。谢谢。 - Luc-Olivier
使用这种方法,您无法将 key: string 替换为任何其他类型。编译器会报错。 - windmaomao

7

我不太擅长TypeScript,但当我深入研究我们的代码库时,发现以下方法也是有效的,并且可以更加健壮,因为否则你将无法使用非字符串作为键。

export enum SORT_TYPES {
  DISPLAY_NAME_ASC = 'Patient: A-Z',
  DISPLAY_NAME_DESC = 'Patient: Z-A',
}

export const SORT_ORDERS: Map<SORT_TYPES, String[]> = new Map([
  [SORT_TYPES.DISPLAY_NAME_ASC, ['display_name', 'ASC']],
  [SORT_TYPES.DISPLAY_NAME_DESC, ['display_name', 'DESC']],
])

因此,这里使用了 Map 类型,而键类型变为 SORT_TYPES 而非字符串。


谢谢。这是一个更好的答案,因为否则像 .get(...) 这样的函数将无法被编译器正确检测到。 - Freddie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接