Typescript 如何为类型由其同级字段确定的GraphQL抽象字段实现解析器? 问题

Typescript 如何为类型由其同级字段确定的GraphQL抽象字段实现解析器? 问题,typescript,graphql,apollo-server,Typescript,Graphql,Apollo Server,我正在使用实现一个位于RESTAPI之上的GraphQL服务器 RESTAPI返回一个实体,其根级别字段决定另一个根级别字段的形状。i、 e { “entityType”:“foo”, “entityMetadata”:{/*基于`entityType`*/}的值, } 在GraphQL模式中,其形状由其同级值决定的字段是抽象类型。我想为那个抽象字段写一个解析器。我想我应该使用,但我在这样做时遇到了困难,因为我传递给抽象字段的\uu resolveType方法的参数没有包含任何引用同级字段值的

我正在使用实现一个位于RESTAPI之上的GraphQL服务器

RESTAPI返回一个实体,其根级别字段决定另一个根级别字段的形状。i、 e

{
“entityType”:“foo”,
“entityMetadata”:{/*基于`entityType`*/}的值,
}
在GraphQL模式中,其形状由其同级值决定的字段是抽象类型。我想为那个抽象字段写一个解析器。我想我应该使用,但我在这样做时遇到了困难,因为我传递给抽象字段的
\uu resolveType
方法的参数没有包含任何引用同级字段值的方法

那我该怎么办

另一个例子 我将使用以下GraphQL模式来说明我的问题

type Character {
  job: String!
  weapon: Weapon
}

interface Weapon {
  yearMade: Number
}

type LightSaber implements Weapon {
  yearMade: Number
  color: String
}

type Blaster implements Weapon {
  yearMade: Number
  ammo: Number
}

type Query {
  searchCharacters: [Character]
}
在这个模式中,我有一个
字符
类型,带有
作业
武器
字段。角色的工作决定了他们将使用的武器类型

因此,如果
角色的
任务
“绝地”
的话,他们的武器应该是
光剑类型的,并且有一个唯一的
颜色
区域。如果
角色
任务
“暴风雨衣”
他们的武器将是
爆炸机类型,并带有一个专用
弹药场

interface BaseCharacter {
  job: String
  weapon: Weapon
}

type Jedi implements BaseCharacter {
  job: String
  weapon: LightSaber
}

type Stormtrooper implements BaseCharacter {
  job: String
  weapon: Blaster
}

union Character = Jedi | Stormtrooper

type Query {
  searchCharacters: [Character]
}
我想通过
searchCharacters
查询搜索所有可用字符,并根据武器类型返回其字符数据和武器的专用数据

query {
  searchCharacters {
    type
    weapon {
      yearMade

      ... on LightSaber {
        color
      }

      ... on Blaster {
        ammo
      }
    }
  }
}
这适用于所有字符数据,但我在尝试解析
武器的类型时遇到了一个障碍。到目前为止,我有:

const武器={
__resolveType:async({yearmake},上下文,信息):“光剑”|“爆炸机”=>{
//我如何确定它是光剑还是爆能枪?
},
};
最初,我的印象是
\u resolveType()
函数的
父字段将是已解析的
字符
对象(即
{type:'jedi',武器:{yearMade:8,…otherWeaponProperties},…otherProperties}
),但实际上它只是字段的当前对象(即
{yearMade:8,…其他武器属性}

如果我可以访问
字符
类型
字段,我可以确定武器类型,但我不能

潜在解决方案 我看到了解决这个问题的两种方法

解决方案#1 第一种解决方案是将
字符的
作业
值附加到
武器
对象(即
{job:'jedi',yearmake:8,…otherWeaponProperties}
),这样
武器
字段的
\u resolveType
函数就可以在其第一个参数中访问作业值

const解析器={
查询:{
searchCharacters:async()=>{
返回api.getCharacters().map(apiCharacterData=>{
返回{
//---重要变革的开始---
…字符数据,
武器:{
…apiCharacterData.arm
作业:apiCharacterData.job,
}
//---重要变革的结束---
};
});
},
},
武器:{
//---第一个参数是对象`{job,…apiCharacterData.wearm}`
__resolveType:({job})=>{
返回任务==‘绝地武士’?‘光剑’:‘爆能枪’;
}
},
}
解决方案#2 第二个解决方案是更改基础架构,这样就不用一般化的
字符
类型,而是有
绝地
冲锋队
类型实现了
字符
接口,这些类型明确地详细说明了
武器
字段的类型

interface BaseCharacter {
  job: String
  weapon: Weapon
}

type Jedi implements BaseCharacter {
  job: String
  weapon: LightSaber
}

type Stormtrooper implements BaseCharacter {
  job: String
  weapon: Blaster
}

union Character = Jedi | Stormtrooper

type Query {
  searchCharacters: [Character]
}
然后我只需要将
\u resolveType
添加到
字符
联合类型,而不是
武器
类型

const字符={
__resolveType:({job})=>{
返回任务==‘绝地武士’?‘光剑’:‘爆能枪’;
},
};
救命啊! 在这两种可能的解决方案之间,解决方案#2似乎是朝着正确方向迈出的一步。解决方案#2比解决方案#1的最大好处是,我没有映射api数据,我让解析程序执行每个实体的解析程序需要执行的操作

但是查询的嵌套性质以及包含的
…on BaseCharacter
内联片段让我觉得我误解了如何正确地编写一个GraphQL模式来模拟我试图实现的目标

我很确定这不是一个罕见的问题,但我很难找到解决方法。非常感谢大家的帮助