iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 22
0
Data Technology

GraphQL + ApolloData 入門系列 第 22

ApolloData & TypeScript (二)

  • 分享至 

  • xImage
  •  

介紹

這邊介紹一個 TypeScript 抽象的用法,通常我們會在Server Part 建立 Schema 與 Resolver 然後透過 ApolloData 提供的工具 graphql-tools 的 makeExecutableSchema ,因為要把所有的 Schema 與 Resolver 都 import 到 index.js 然後 makeExecutableSchema, 程式碼多的話會寫很多import

https://ithelp.ithome.com.tw/upload/images/20171227/20103438oHEPtkIRih.png

這樣看起來很多所以改良後會變成這樣

https://ithelp.ithome.com.tw/upload/images/20171227/20103438C5U5RoGlWk.png

配合 TypeScript 使用 抽象類別用法

Schema部分 先定義一個基礎類型

export type Schema = {
  typeDefs: string
  queries: string
  mutations: string
}

export default abstract class BassSchema {
  private _typeDefs: string;
  private _queries: string;
  private _mutations: string;

  constructor(props: Schema) {
    this._typeDefs = props.typeDefs;
    this._queries = props.queries;
    this._mutations = props.mutations;
  }

  public get typeDefs(): string { return this._typeDefs; }
  public get queries(): string { return this._queries; }
  public get mutations(): string { return this._mutations; }
}

這邊export 一個 abstract 類別

https://ithelp.ithome.com.tw/upload/images/20171227/20103438hsgAOCtLBv.png

實例化一個
先 extends 上方的抽象類別

class FbGroupComponent extends BassSchema {

在實例化取得fbGroup給 makeExecutableSchema 要組合 schema使用

const fbGroup = new FbGroupComponent(schema);

組合的部分,先用迴圈塞到個別定義好的變數

省略...
let typeDefs = [];
let queries = [];
let mutations = [];

AllDef.forEach((s) => {
  typeDefs.push(s.typeDefs);
  queries.push(s.queries);
  mutations.push(s.mutations);
})
省略...

最後比較一下組合 makeExecutableSchema 的部分,這樣程式碼就少很多

組合前

https://ithelp.ithome.com.tw/upload/images/20171227/2010343868MFxMImls.png

組合後


export const MySchema = makeExecutableSchema({
  typeDefs: [SchemaDefinition, RootQuery, ...typeDefs],
  resolvers: merge(ResolveQuery[0])
});

resolvers 的部分就不Demo做法同 Schema

總結
不需要寫 TypeScript 用Js也是可以達到同樣的效果,這邊示範 TypeScript 的寫作方式,這做法最大的好處就是不用關注哪些schema或 resolver 有新增刪除還要去管理 makeExecutableSchema 的 import 與typeDefs,resolvers ,對後端開發人員幫助很大呢


上一篇
ApolloData & TypeScript (一)
下一篇
ApolloData & Next.js (一)
系列文
GraphQL + ApolloData 入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言