有没有办法避免 GraphQL 中的循环类型依赖?
Is there a way to avoid circular type dependencies in GraqhQL?
考虑参考实现的主要 SWAPI 示例:https://github.com/graphql/swapi-graphql
// film.js
import PersonType from './person';
// person.js
import FilmType from './film';
无处不在。这些循环依赖是可以接受的做法吗?有什么好的模式可以避免这种情况吗?在 GraphQL 的最终演示中包含有问题的做法似乎很糟糕。
在 GraphQL 的情况下,这不是坏习惯,他们甚至为这种情况准备了解决方案。如果你定义了某种类型的 fields
属性,你可以将它声明为一个函数
const User = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: { type: GraphQLID }
// other attributes
})
});
graphql-js
使用名为 resolveThunk
的方法来处理 fields
属性等,其实现如下
function resolveThunk<T>(thunk: Thunk<T>): T {
return typeof thunk === 'function' ? thunk() : thunk;
}
如您所见,它会检查 thunk
(在本例中为字段)是否正常运行。如果是,returns 就是结果,否则 returns thunk 本身。
考虑参考实现的主要 SWAPI 示例:https://github.com/graphql/swapi-graphql
// film.js
import PersonType from './person';
// person.js
import FilmType from './film';
无处不在。这些循环依赖是可以接受的做法吗?有什么好的模式可以避免这种情况吗?在 GraphQL 的最终演示中包含有问题的做法似乎很糟糕。
在 GraphQL 的情况下,这不是坏习惯,他们甚至为这种情况准备了解决方案。如果你定义了某种类型的 fields
属性,你可以将它声明为一个函数
const User = new GraphQLObjectType({
name: 'User',
fields: () => ({
id: { type: GraphQLID }
// other attributes
})
});
graphql-js
使用名为 resolveThunk
的方法来处理 fields
属性等,其实现如下
function resolveThunk<T>(thunk: Thunk<T>): T {
return typeof thunk === 'function' ? thunk() : thunk;
}
如您所见,它会检查 thunk
(在本例中为字段)是否正常运行。如果是,returns 就是结果,否则 returns thunk 本身。