【问题标题】:extending map with a model implementation使用模型实现扩展地图
【发布时间】:2021-06-25 15:43:21
【问题描述】:

我有一个休息调用 json 响应,如下所示:

"20412": [
  {
    "username": "foo",
    ...
  },
  ...
],
"20485": [
  ...

数组中的对象是User 模型。

我正在尝试为这个 json 创建一个接口,我可以在其中执行assetUsers.get("20412") 并让用户使用它。

我试过了:

export interface AssetUsers extends Map<string, User[]> {}

但是(当尝试使用类似于上面的 json 创建模拟 AssetUsers 对象时)这给了我一个“不可分配”错误,指出 AssetUsers 类型中不存在 20412。

Simplified example:

export interface User {
    username: string;
}
export interface AssetUsers extends Map<string, User[]> { }

const mockAssetUsers: AssetUsers = {
    "204311":[
        {
            "username":"foo",
        },
        {
            "username":"bar",
        },
    ],
    "204832":[
        {
            "username":"bob",
        },
        {
            "username":"baz",
        },
    ],
}

如何为这个 json 适当地创建模型接口?

【问题讨论】:

  • 您必须知道您将映射键声明为数字,但您上面显示的示例使用字符串键代替。我知道 javascript 在这方面非常灵活,但这可能会导致问题。
  • @JuanDavid - 进行了上述更改,但结果相同
  • 请考虑修改此问题中的代码以构成minimal reproducible example,将其放入像The TypeScript Playground 这样的独立IDE 时,可以清楚地说明您面临的问题。这将使那些想要帮助您的人立即着手解决问题,而无需首先重新创建它。它将使您得到的任何答案都可以针对定义明确的用例进行测试。
  • 你可以看看这个:codebuckets.com/2018/06/17/…

标签: angular typescript extend


【解决方案1】:

get() 方法从 Map 对象返回指定元素,JSON 对象没有 get() 方法,您也不能将映射接口分配给 JSON 对象。

export interface User {
  username: string;
}
export interface AssetUsers extends Map<string, User[]> {}
const mockAssetUsers: AssetUsers = new Map();

mockAssetUsers.set("204311", [
  {
    username: "foo",
  },
  {
    username: "bar",
  },
]);

mockAssetUsers.set("204832", [
  {
    username: "bob",
  },
  {
    username: "baz",
  },
]);

console.log(mockAssetUsers.get("20411"));

P.S 也许这是相关的,但这样做不会让你使用 get() 方法。

const mockAssetUsers: {[key: string]: User[]}

【讨论】:

  • 是的,与httpClient.get&lt;AssetUsers&gt; 合作也许我将无法扩展地图,而必须使用类似于您的第二种方法的方法
  • 您可以将 Map 构造函数与 Object.entries (see here) 一起使用。
  • 在您的服务中与 httpClient 一起使用,getAssetUsers(): Observable&lt;AssetUsers&gt;{type A = {[key: string]: User[]}; return this.httpClient.get&lt;A&gt;().pipe(map(x =&gt; new Map(Object.entries(x))));}
【解决方案2】:

不是接口,但你可以声明一个类型:

type AssetUsers = Map<string, User[]>;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
  • 2012-05-20
  • 2012-07-04
  • 2020-04-06
  • 2016-12-25
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多