如何为 Set Map of Sets 的 Java Map 声明 TypeScript 类型?
Posted
技术标签:
【中文标题】如何为 Set Map of Sets 的 Java Map 声明 TypeScript 类型?【英文标题】:How to declare the TypeScript Type for a Java Map of Map of Sets? 【发布时间】:2019-02-03 01:36:30 【问题描述】:在 Java 中我有这样的东西:
public class MyMatrix implements Map<Long, Map<Long, Set<MyObject>>> ...
我想做的是在TypeScript中声明这个Map的对应类型。
对应的JSON是:
"1":
"1":["id":1,"id":2]
,
"2":
"1":["id":2,"id":3]
我希望能够使用关联数组表示法来访问它,例如myArray[1][1] should return ["id":1,"id":2]
我尝试过使用类似的东西
var myMatrix: Array<Array<Array<MyObjec>>>;
但没有运气。
尝试以下代码时:
for (const x in Object.keys(this.myMatrix))
for (const y in Object.keys(this.myMatrix[x]))
我在第二个 for 循环中收到以下错误:
ERROR TypeError: Cannot convert undefined or null to object
at Function.keys (<anonymous>)
希望我发现了一点提示:这个错误的原因似乎是在第一个循环中Object.keys
是从'0'
而不是'1'
开始的,这对我。
【问题讨论】:
既然你使用的是 typescript,为什么不使用 ES6Map
和 Set
呢?像这样定义你的变量:let myMatrix: Map<number, Map<number, Set<any>>>;
【参考方案1】:
HugoTeixeira 的类型对我来说很合适。这段代码:
for (const x in Object.keys(this.myMatrix))
for (const y in Object.keys(this.myMatrix[x]))
应该是:
for (const x of Object.keys(this.myMatrix))
// ^^
for (const y of Object.keys(this.myMatrix[x]))
【讨论】:
【参考方案2】:您可以为每一层创建一种类型,如下所示:
interface Column
id: number;
interface Row
[key: number]: Array<Column>;
class Matrix
[key: number]: Row;
然后你可以像这样创建一个矩阵:
const myMatrix: Matrix =
"1":
"1":["id":1,"id":2]
,
"2":
"1":["id":2,"id":3]
;
从 Typescript 代码中,您可以根据需要使用关联数组表示法访问矩阵:
const arr = myMatrix[1][1];
console.log(JSON.stringify(arr));
打印出来:
["id":1,"id":2]
【讨论】:
【参考方案3】:我们可以在 Typescript 中声明 Maps,因此您可以尝试使用类似下面的内容,然后使用 foreach 对其进行迭代。
var dataMap = new Map<number, Map<number,Array<Obj>>>();
【讨论】:
以上是关于如何为 Set Map of Sets 的 Java Map 声明 TypeScript 类型?的主要内容,如果未能解决你的问题,请参考以下文章
[codeforces722D]Generating Sets
js遍历集和(Array,Map,Set) (forEach, map, for, for...in, for...of)