簡體   English   中英

如何描述嵌套 object 的類型? 如何描述聯合類型?

[英]How to descibe type for nested object ? How to Describe union types?

我正在嘗試為查詢編寫我的 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}

在此處輸入圖像描述

誰能解釋我如何使用我的 typedef 中描述的屬性“kg”和“lb”以及為什么我不能寫這樣的聯合? union Mass2 = Int|Float

您需要為MassInt.kgMassFloat.kg字段指定不同的名稱,否則會引發沖突錯誤。

聯合類型官方文檔。

正確的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
        }
      }
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM