网站搜索

数组 - 如何声明 TypeScript 类型以表示一个 Java 的 Map 的 Map 的 Set?


在 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] 应该返回 [{"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',这对我来说甚至更奇怪。

答案#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}]