在 GraphQL Schema 中定义 Map 对象的最佳方法?

Tan*_*ito 11 node.js typescript graphql nestjs

我尝试用对象数组映射一个键字符串。

我可以创建一个简单的对象,但我想在这些数组中轻松添加一个对象。地图对象非常适合执行此操作。

问题:我不知道如何为 GraphQL 定义类型映射 :'(

@ObjectType()
export class Inventaire
  @Field()
  _id: string;

 @Field()
  stocks: Map<string, Article[]>;
}
Run Code Online (Sandbox Code Playgroud)

小智 16

GraphQL 是一种强类型语言,不提供任何开箱即用的地图类型。键值对的 JSON blob 没有强大的架构,所以你不能有这样的东西:

{
    key1: val1,
    key2: val2,
    key3: val3,
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,您可以定义一个 GraphQL Schema 以具有键值元组类型,然后定义您的属性以返回这些元组的数组。

type articleMapTuple {
     key: String
     value: Article
}

type Inventaire {
     stocks: [articleMapTuple]
}
Run Code Online (Sandbox Code Playgroud)

那么您的返回类型将如下所示:

    data [
    {
        key: foo1,
        value: { some Article Object}
    },
    {
        key: foo2,
        value: { some Article Object}
    },
    {
        key: foo3,
        value: { some Article Object}
    },
]
Run Code Online (Sandbox Code Playgroud)

  • “GraphQL 是一种强类型语言,不提供任何类型的开箱即用的地图类型。” 就像没有强类型语言提供地图类型一样?前半句和后半句没有任何联系。 (21认同)
  • 也许我应该澄清一下 - GraphQL 是一种强类型语言,*它*不提供任何类型的开箱即用的地图类型。因此,您需要定义自己的。 (7认同)
  • Map 的关键在于每个“key”都是相同的类型,每个“value”都是相同的类型,因此 Map 也是一个强类型结构。 (5认同)
  • 每种强类型语言都支持映射构造。 (4认同)
  • @gacharya 缺少 Map 类型仍然与强类型没有任何关系。地图对于表示本质上是映射的数据很有用。如果用于表示对象的属性,这是非常糟糕的,并且违背了键入的目的,但这不是映射的主要目标。 (3认同)