Hay una situación en la que hay dos tipos posibles para completar la propiedad de data . He creado un tipo de union para eso ( ComponentItem ) para determinar qué campo debe devolverse. El primer esquema ( ComponentItem1 ) debe ser simplemente una lista codificada pero el segundo ( ComponentItem2 ) es más dinámico donde obtiene un searchTerm de búsqueda de la consulta y en realidad llama a un punto final para completar la list y también tiene la propiedad hasNextPage .
Aquí están los esquemas que hice:
type Component { id title data: ComponentItem } union ComponentItem = ComponentItem1 | ComponentItem2 type ComponentItem1 { list: [List!]! } type ComponentItem2 { hasNextPage: Boolean; list: [List!]! } En el resolver, estoy resolviendo el tipo de unión para generar el __typename adecuado:
const resolver: { ComponentItem: { __resolveType(object) { if(object.searchTerm){ return "ComponentItem2" } return "ComponentItem1" }, }, } Lo que estoy haciendo actualmente es resolver la list y hasNextPage individualmente, pero en este escenario envío la solicitud al mismo punto final dos veces.
const resolver = { ...resolver, ComponentItem2: { list: async (root, __, context) => { const result = await fetch('search-endpoint') return result?.items || [] } hasNextPage: async (root, __, context) => { const result = await fetch('search-endpoint') return result?.hasNextPage || false } } }Mi pregunta es cómo es posible compartir ese resultado en otra resolución de campo (aparte de usar "contexto"). O si hay alguna forma mejor de manejar esta situación, házmelo saber.