javascripttypescriptgraphql-codegen

Convert Maybe<string>[]' to 'string[]


I am using graphql with generated types and struggling with how to convert them to the type I need to pass it to my data service calls.

@graphql-codegen has given me an args type of

export type QueryOrdersArgs = {
  ids: Array<Maybe<Scalars['ID']>>;
};

(I don't really understand why its generated as a Maybe type, as the graphql schema enforces that I only query with a parameter of an array of ids (strings))

In my resolver, I need to call into a service which takes an array of strings. Everything works as expected (with @ts-ignore) but now I need to fix up my types.

const { orderIds } = args;
const result = getOrder(orderIds);

I have a codesandbox with just the types here https://codesandbox.io/s/typescript-playground-export-forked-3fpx9?file=/index.ts

export type Maybe<T> = T | null;
export type Scalars = {
  ID: string;
  String: string;
  Boolean: boolean;
  Int: number;
  Float: number;
  _FieldSet: any;
};

let ids: Array<Maybe<Scalars["ID"]>>;

export const getOrders = (orderIds: Array<string>) => {
  orderIds.map((x) => console.log(x));
};

getOrders(ids);

I currently get the error - "TS2345: Argument of type 'Maybe[]' is not assignable to parameter of type 'string[]'."

Any help greatly appreciated


Solution

  • If you're confident that it shouldn't be a Maybe type, you can cast it:

    type Maybe<T> = T | null;
    const maybeArray: Maybe<string>[] = [];
    let stringArray: string[] = maybeArray as string[];
    

    or in your case

    getOrders(ids as string[]);