微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何描述嵌套对象的类型?如何描述联合类型?

如何解决如何描述嵌套对象的类型?如何描述联合类型?

我正在尝试为查询编写 typeDefs。

import {gql} from "@apollo/client";

const typeDefs = gql`
    
    type Query{
        rockets:[Rocket]!
        rocket(id:ID):Rocket!
    }
    type Rocket {
        id:ID!
        name:String!
        mass:RocketMass
    }
    type MassInt{
        kg:Int
    }    
    type MassFloat{
        kg:Float
    }
    
    union Mass = MassInt|MassFloat

    type RocketMass {
        kg: Mass
        lb: Mass
    }

`
export {typeDefs}

当我编写“GET_ROCKET”查询时,我的 IDE 出现错误

import {gql} from "@apollo/client";

const GET_ROCKETS = gql`
    query GetRockets {
        rockets{
            id,name
        }
    }
`
const GET_ROCKET = gql`
    query GetRocket($id:ID!){
        rocket(id: $id){
        mass {
            kg,lb
        }
        name
    }
    }
`
export {GET_ROCKETS,GET_ROCKET}

enter image description here

谁能解释我如何使用我的 typedef 中描述的属性“kg”和“lb”,以及为什么我不能像这样编写联合? union Mass2 = Int|Float

解决方法

您需要为MassInt.kgMassFloat.kg字段指定不同的名称,否则会引发冲突错误。

参见union types官方文档。

正确的 typeDefsGET_ROCKET GraphQL 查询应该是这样的:

import express from 'express';
import { ApolloServer,gql } from 'apollo-server-express';
import faker from 'faker';
const app = express();

const typeDefs = gql`
  type Query {
    rockets: [Rocket]!
    rocket(id: ID): Rocket!
  }
  type Rocket {
    id: ID!
    name: String!
    mass: RocketMass
  }
  type MassInt {
    int: Int
  }
  type MassFloat {
    float: Float
  }

  union Mass = MassInt | MassFloat

  type RocketMass {
    kg: Mass
    lb: Mass
  }
`;

const resolvers = {
  Query: {
    rocket: (_,{ id }) => {
      return {
        id: 1,name: faker.lorem.word(),mass: {
          kg: { int: 100 },lb: { float: 10.1 },},};
    },Mass: {
    __resolveType: (obj) => {
      if (isInt(obj.int)) {
        return 'MassInt';
      }
      if (isFloat(obj.float)) {
        return 'MassFloat';
      }
      return null;
    },};

function isInt(n) {
  return Number(n) === n && n % 1 === 0;
}

function isFloat(n) {
  return Number(n) === n && n % 1 !== 0;
}
const server = new ApolloServer({ typeDefs,resolvers });
const port = 4000;
server.applyMiddleware({ app,path: '/graphql' });
app.listen(port,() => console.log(`Apollo server started at http://localhost:${port}`));
query GetRocket($id: ID){
  rocket(id: $id){
    id
    name
    mass {
      kg {
        ... on MassInt {
          int
        }
        ... on MassFloat {
          float
        }
      }
      lb {
        ... on MassInt {
          int
        }
        ... on MassFloat {
          float
        }
      }
    }
  }
}

查询结果:

{
  "data": {
    "rocket": {
      "id": "1","name": "modi","mass": {
        "kg": {
          "int": 100
        },"lb": {
          "float": 10.1
        }
      }
    }
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。