= builder.objectType("User", { fields: (t) => ({ id: t.exposeID("id"), // type: [Post] と宣言 → resolve の返り値型が Post[] にガードされる posts: t.field({ type: [Post], // parent, args, 返り値も objectType や field 定義から型推論される resolve: (parent, _args, ctx) => ctx.postLoader.loadByUserId(parent.id), }), }), }); codegen なし。DSL の型推論が、書いた瞬間に整合性を担保。