Как спроектировать несколько типов объектов с большинством одинаковых полей - PullRequest
0 голосов
/ 07 января 2020

Вот мои typedefs:

  interface BaseTopic {
    id: ID!
    title: String!
  }

  type BaseTopicWithAuthor implements BaseTopic {
    id: ID!
    title: String!
    author: BaseUser!
  }

  type Topic implements BaseTopic {
    id: ID!
    title: String!
    author_id: ID!
    content: String!
    reply_count: Int
    visit_count: Int
    create_at: String
    author: BaseUser!
  }

  type TopicDetail implements BaseTopic {
    id: ID!
    author_id: ID!
    content: String!
    title: String!
    reply_count: Int
    visit_count: Int
    create_at: String
    author: BaseUser!
    replies: [Reply]!
    is_collect: Boolean
  }

Проблема в том, что большинство полей одинаковы для Topic типа объекта и TopicDetail типа объекта. Слишком многословно писать одни и те же поля несколько раз. Что, если есть еще «Topi c» с несколькими различными полями, я должен снова написать эти же поля (id, title, author_id, content, et c ...) и снова и добавьте одно другое поле для нового * Topic типа объекта. Например,

type TopicNew implements BaseTopic {
    # I have to write below fields which same with Topic and TopicDetail object types again. 
    # It's too verbose.
    id: ID!
    author_id: ID!
    content: String!
    title: String!
    reply_count: Int
    visit_count: Int
    create_at: String
    author: BaseUser!
    # add a new different field
    newField: String
}

Я прочитал этот пост: Как наследовать или расширять typeDef в GraphQL

Таким образом, для сокращения дублирующихся полей, единственный выбор - использовать graphql-s2s пакет?

Я знаю, что могу определить некоторые общие определения типа строки и использовать его как

type Topic implements BaseTopic {
    ${commonFields}
    author: BaseUser!
}

type TopicDetail implements BaseTopic {
    ${commonFields}
    author: BaseUser!
    replies: [Reply]!
    is_collect: Boolean
}

Но это слишком уродливо и не совсем в графическом стиле. Это JS языковой способ с использованием литералов шаблона . Поддерживает ли graphql SDL какой-либо способ справиться с этим сценарием?

...