GraphQL type featuring a union property defined inline

Trying to create a matching GQL type for this Typescript interface:

interface List {
  items: [String] | [[String]]
}

Initially, I attempted to keep it straightforward:

type List {
  items: [String]! | [[String]!]!
}

However, GQL did not approve of that approach. So, I decided to try something different:

type List1D {
  items: [String]!
}

type List2D {
  items: [[String]!]!
}

union ListItems = List1D | List2D

type List {
  items: ListItems
}

My concern is that it might lead to a structure like this:

{
  items: {
    items: [] // union type
  }
}

How can I achieve my original goal with this setup?

Answer №1

An effective approach would be to always bundle up individual items as arrays and define the schema like this:

interface List {
  """If the internal representation consists of a flat array of strings,
  it is enclosed in an array with a length of 1 containing that array."""
  items: [[String]]
}

A challenge you might encounter is that unions can only consist of named object types (refer to "Type Validation" rule 2).

Based on my experience working with GraphQL, attempting to replicate arbitrary JSON using the GraphQL schema language may not be feasible. I recommend designing an API for external users first, irrespective of your internal data structure; afterward, use resolver functions to transform your internal storage into the necessary types and fields for the API. Focus on the logic of the API rather than worrying about additional layers of JSON objects in the response.

If distinguishing between a 1-dimensional or 2-dimensional array of results is significant for the API consumer, the format you showcased is appropriate (and indeed, the JSON response will feature two levels of items:).

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Interface of TypeScript Undetermined

Currently, I am developing a Demo API Wrapper specifically for Roblox. During the development process, I have come across a certain issue that I would like to address. My aim is to send a request and then return all the data in the manner of an API wrapper ...

Update the TemplateUrl according to the URL Parameters (GET)

I've created a basic Angular code snippet (test.component.ts) that retrieves a variable from GET parameters: import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; @Component({ select ...

Connecting Ag Grid with modules

Unable to link with modules as it's not a recognized attribute of ag-grid-angular https://i.sstatic.net/2zwY2.png <ag-grid-angular #agGrid style="width: 100%; height: 100%;" id="myGrid" class="ag-theme-balham" [mod ...

Angular asynchronous operations are failing to complete within the specified time frame

Observations suggest that Angular's async from @angular/core/testing is not properly resolving timeouts in tests when a beforeEach contains async as well. Sadly, the bug cannot be replicated on Plunkr or JSFiddle platforms. To reproduce this issue ea ...

Rearrange the provided string in a particular manner

Looking to transform a string like '12:13:45.123 UTC Sun Oct 17 2021' into 'Sun Oct 17 2021 12:13:45.123 UTC' without calling slice twice. Is there a more elegant and efficient way to achieve this? Currently using: str.slice(18)+&apo ...

Use RXJS to prevent having multiple nested subscriptions

I am looking to revamp the code snippet below: this.dataUserSubscription = this.store$.pipe(select(selectUser)).subscribe( user => { this.store$.pipe(select(selectUserData, {user}), take(1)) .subscribe(u ...

Leverage the optional attribute of an interface as a data type within openapi-typescript

Is there a way to use an interface property as a variable type in TypeScript? I need to access the property: string type and use it as a variable type, but I'm having trouble accessing it. interface foo { bar?: { baz: { property: string; ...

I am looking to modify a particular value within an array of objects, but for some reason, the update is not being applied correctly

When attempting to copy the array, I update the selected value of a specific object based on the matching memberId. This process works well for a single member, however, issues arise when there are multiple members as the updating doesn't work correct ...

The input type 'unknown' cannot be assigned to the output type 'string' when utilizing the filter(Boolean) operator

.ts: siteName: string; this.store.pipe( select(getSiteName), filter(Boolean), take(1) ).subscribe(siteName => this.siteName = siteName); Error: Type 'unknown' is not assignable to type 'string ...

Testing the mirkoORM entities at a unit level

Trying to perform a unit test on a method within a MikroORM entity, I am attempting to populate a mikroORM collection field with test data. Specifically, I am using jest for this task: describe('Team Tests', () => { it('isLeader shoul ...

Input for uncomplicated changing identifier

I am looking to create types for dynamic keys that will be of type number. I have two similar types defined as follows: type UseCalculatePayments = () => { totalPayments: number; aggregate: number; condition: boolean; }; type UseCalculateCommissio ...

Modifying the date format of the ag-Grid date filter

On my Angular 5.2.11 application, I utilize ag-grid to showcase a table. The date column is configured with the default date filter agDateColumnFilter as per the documentation. After enabling browserDatePicker: true, the Datepicker displays dates in the ...

Retrieve the value of a promise and transfer it to the subsequent function of an observable

For my Angular 9 application, I have created a custom interceptor called AuthorizationHeaderInterceptor: @Injectable() export class AuthorizationHeaderInterceptor implements HttpInterceptor { constructor(private authenticationService: AuthenticationSer ...

What could be causing the NodeJs cluster module to be malfunctioning?

Currently, I am in the process of constructing an express server and have been exploring the concept of scaling NodeJS applications. Upon my research, one of the initial things that caught my eye was the built-in cluster module which allows for leveraging ...

Is it possible to view the original source code by simply clicking ctrl + click?

Currently, I am working on a project involving TypeScript and Angular, utilizing the library Spartacus. Often times, I find myself needing to reference the source code. This is how I currently go about it: I come across StateUtil from @spartacus/core, th ...

TypeScript's reusable retry functionality

This specialized function takes an input function as its first argument and a set of customizable options as its second. It repeatedly calls the provided function, retrying until either a successful result is returned or the maximum number of attempts is r ...

Tips for executing forEach on a promise?

I am currently working with a function that returns a promise of an array: async function functionReturningPromiseOfUserIDs(): Promise<string[]> My question is, can I use the forEach method on the array returned by this function? async function runF ...

Explore all Intellisense choices for Typescript Props in VS Code effortlessly

In my experience, I've noticed that to see intellisense options for a TypeScript type in VS Code, you have to start typing the attribute name. If you type "a", you'll only see options that contain "a" and nothing else. Take a look at this scree ...

Apologies, but there was an unexpected error: Uncaught (in promise): TypeError: Unable to access the 'customerName' property of an undefined

Check out the structure of my JSON file: { "total": 3, "items": [ { "id": "01", "data": { "customerName": "Jhon", "description": "..some content..", "price": "25000" ...

Utilizing Props in Next.js with a Form Component

Currently, I am diving into the world of Nextjs and facing a challenge in passing a variable through a form component, and then further through its server action component. (I believe this is referred to as prop drilling, and I'm exploring if there&ap ...