【问题标题】:Is it possible to implement multiple interfaces in GraphQL?是否可以在 GraphQL 中实现多个接口?
【发布时间】:2017-12-26 21:30:01
【问题描述】:

是否可以在 GraphQL 模式中指定实现多个接口的类型?如果是这样,这将如何实现?

【问题讨论】:

    标签: graphql


    【解决方案1】:

    是的。如spec中所述:

    一个对象类型可以声明它实现了一个或多个独特的接口。

    请记住,生成的对象必须是“它实现的所有接口的超集”——它必须实现每个接口具有的所有字段,并且这些字段不能冲突。例如,如果接口 A 和接口 B 都有一个名为 something 的字段,则该字段的类型对于两个接口必须相同,以便对象类型实现这两个接口。

    这是一个简单的例子,你可以open in CodeSandbox 玩玩。

    注意:正如其他人指出的那样,不再支持使用逗号分隔接口 - 请改用 &(与号)。

    const { ApolloServer, gql } = require("apollo-server");
    
    const typeDefs = gql`
      type Query {
        someAnimal: Animal!
        someBird: Bird!
      }
    
      interface Bird {
        wingspan: Int!
      }
    
      interface Animal {
        speed: Int!
      }
    
      type Swallow implements Animal & Bird {
        wingspan: Int!
        speed: Int!
      }
    `;
    
    const resolvers = {
      Query: {
        someAnimal: (root, args, context) => {
          return { wingspan: 7, speed: 24 };
        },
        someBird: (root, args, context) => {
          return { wingspan: 6, speed: 25 };
        }
      },
      Bird: {
        __resolveType: () => "Swallow"
      },
      Animal: {
        __resolveType: () => "Swallow"
      }
    };
    
    const server = new ApolloServer({
      typeDefs,
      resolvers
    });
    
    server.listen().then(({ url }) => {
      console.log(`? Server ready at ${url}`);
    });
    

    请注意,该规范现在还允许interfaces to implement other interfaces

    当定义实现另一个接口的接口时,实现接口必须定义由实现接口指定的每个字段...传递实现的接口(由正在实现的接口实现的接口)也必须在实现上定义类型或接口。

    在 GraphQL.js 中,从 15.0.0 版开始支持此功能。

    【讨论】:

    • 根据最新版本的规范(graphql.github.io/graphql-spec/draft/#sec-Interfaces):“类型也可以实现多个接口。例如,Business 实现了示例中的NamedEntityValuedEntity 接口[以下]。” type Business implements NamedEntity & ValuedEntity {
    【解决方案2】:

    似乎逗号分隔接口不再起作用。我不得不使用“&”来让它工作(阿波罗),看到这个答案https://stackoverflow.com/a/49521662/1959584

    type Something implements First & Second
    

    【讨论】:

    • 根据最新版本的规范(graphql.github.io/graphql-spec/draft/#sec-Interfaces):“类型也可以实现多个接口。例如,Business 实现了示例中的NamedEntityValuedEntity 接口[以下]。” type Business implements NamedEntity & ValuedEntity {
    【解决方案3】:

    我认为是的,正如规范在http://facebook.github.io/graphql/June2018/#sec-Interfaces 上描述的那样应该是可能的。

    这是一个例子。

    interface NamedEntity {
      name: String
    }
    
    interface ValuedEntity {
      value: Int
    }
    
    type Person implements NamedEntity {
      name: String
      age: Int
    }
    
    type Business implements NamedEntity & ValuedEntity {
      name: String
      value: Int
      employeeCount: Int
    }
    

    【讨论】:

    • 根据最新版本的规范(graphql.github.io/graphql-spec/draft/#sec-Interfaces):“类型也可以实现多个接口。例如,Business 实现了示例中的NamedEntityValuedEntity 接口[以下]。” type Business implements NamedEntity & ValuedEntity {
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2015-12-23
    相关资源
    最近更新 更多