2015-09-13 23 views
9

このdoesntの仕事の種類は、ルートのフィールド定義で自己を参照するため:自己参照データ階層用のグラフ・スキーマを作成するにはどうすればよいですか?

var routeType = new GraphQLObjectType({ 
    name: 'MessageRoute', 
    fields: { 
    name: { 
     type: GraphQLString 
    }, 
    routes: { 
     type: new GraphQLList(routeType), 
     resolve: (route) => { 
     return route.routes; 
     } 
    } 
    } 
}); 

はので、私はそれをどのように行うのですか?

答えて

13

GraphQL型は、オブジェクトではなくオブジェクトを返す関数としてfieldsを定義することで、それ自身を参照できます(またはファイルの後の別の型を参照することもできます)。この関数は、ページが完全に解析された後に呼び出されます。ご例えば

var routeType = new GraphQLObjectType({ 
    name: 'MessageRoute', 
    fields: function() { 
    return { 
     name: { 
     type: GraphQLString 
     }, 
     routes: { 
     type: new GraphQLList(routeType), 
     resolve: (route) => { 
      return route.routes; 
     } 
     } 
    }; 
    } 
}); 

それとも、あなたはES6を使用している場合、この使用して矢印の機能のための素敵な速記:

var routeType = new GraphQLObjectType({ 
    name: 'MessageRoute', 
    fields:() => ({ 
    name: { 
     type: GraphQLString 
    }, 
    routes: { 
     type: new GraphQLList(routeType), 
     resolve: (route) => { 
     return route.routes; 
     } 
    } 
    }) 
}); 
+0

クールおかげで、私は取得せずに、物事の反応側を書く方法任意のアイデア:

はので、代わりの関数内全体fieldsプロパティを巻き付けて、あなただけのこのようなtypeプロパティの機能を使用することができますスタックオーバーフロー? – SammoSampson

1

は、私はあなたができることを指摘したいと思いますJavascript getterを使用してオブジェクト内の任意のプロパティに関数を使用します。

var routeType = new GraphQLObjectType({ 
    name: 'MessageRoute', 
    fields: { 
    name: { 
     type: GraphQLString 
    }, 
    routes: { 
     get type() { 
     return new GraphQLList(routeType) 
     }, 
     resolve: (route) => { 
     return route.routes; 
     } 
    } 
    } 
}); 
関連する問題