Я пытаюсь написать свой 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}
Может ли кто-нибудь объяснить, как я могу использовать свойства «kg» и «lb», которые описаны в моих typedefs, и почему я не могу писать такие объединения? union Mass2 = Int|Float



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно дать разные имена для полей MassInt.kg и MassFloat.kg, иначе это вызовет ошибку конфликта.
См. Официальный документ типы профсоюзов.
Правильный запрос typeDefs и GET_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.info(`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
}
}
}
}
}