有没有办法避免 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 本身。