dotansimha / graphql-code-generator-community

MIT License
114 stars 145 forks source link

TypeGraphQL Generator with Union type fails with error #121

Open ryall opened 3 years ago

ryall commented 3 years ago

Describe the bug

When generating TypeGraphQL, using a union type, the type passed to `@TypeGraphQL.Field` fails with the error: `'Step' only refers to a type, but is being used as a value here. (TS 2693)` **To Reproduce** Steps to reproduce the behavior: Run the generation below.
  1. My GraphQL schema:
type PullStep @entity {
  nextSteps: [Step!] @column
  # ...other fields...
}

type PushStep @entity {
  nextSteps: [Step!] @column
  # ...other fields...
}

union Step = PullStep | PushStep
  1. My codegen.yml config file:
generates:
  types.ts:
    plugins:
      - typescript-type-graphql
  1. The output:
import * as TypeGraphQL from 'type-graphql';
export { TypeGraphQL };
export type Maybe<T> = T | null;
export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] };
export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> };
export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> };
export type FixDecorator<T> = T;
/** All built-in and custom scalars, mapped to their actual values */
export type Scalars = {
  ID: string;
  String: string;
  Boolean: boolean;
  Int: number;
  Float: number;
};

@TypeGraphQL.ObjectType()
export class PullStep {
  __typename?: 'PullStep';

  @TypeGraphQL.Field(type => [Step], { nullable: true })
  // ^^^^ !!! "'Step' only refers to a type, but is being used as a value here. (TS 2693)" !!!
  // ^^^^
  nextSteps!: Maybe<Array<Step>>;
};

@TypeGraphQL.ObjectType()
export class PushStep {
  __typename?: 'PushStep';

  @TypeGraphQL.Field(type => [Step], { nullable: true })
  // ^^^^ !!! "'Step' only refers to a type, but is being used as a value here. (TS 2693)" !!!
  // ^^^^
  nextSteps!: Maybe<Array<Step>>;
};

export type Step = PullStep | PushStep;

Expected behavior

No error. To fix this, it probably needs a union type generated: https://typegraphql.com/docs/unions.html

Environment:

Additional context

Ranguna commented 2 years ago

+1

Here's another example:

type TypeA {
  propA: String
}
type TypeB {
  propB: Boolean
}
union TypeAB = TypeA | TypeB

type someRandomType {
  typeAB: TypeAB
}

Results in the following typescript code:

...
@TypeGraphQL.ObjectType()
export class TypeA {
  __typename?: 'TypeA';

  @TypeGraphQL.Field(type => String, { nullable: true })
  propA!: Maybe<Scalars['String']>;
};

@TypeGraphQL.ObjectType()
export class TypeB {
  __typename?: 'TypeB';

  @TypeGraphQL.Field(type => Boolean, { nullable: true })
  propB!: Maybe<Scalars['Boolean']>;
};

export type TypeAb = TypeA | TypeB;

@TypeGraphQL.ObjectType()
export class SomeRandomType {
  __typename?: 'someRandomType';

  @TypeGraphQL.Field(type => TypeAb, { nullable: true })
  //                                                ^ This is a type, not a class
  typeAB!: Maybe<TypeAb>;
};

@charlypoly any reason for removing the confirmed tag ? You can reproduce this is https://www.graphql-code-generator.com/ by pasting the above graphql schema. image

Tried to reproduce this in codesandbox but for some reason it was giving me 502, either way, this one should work: https://codesandbox.io/s/sharp-austin-94tiqe?file=/schema.graphql

binoiii commented 1 year ago

Hey @dotansimha @Ranguna @ryall, you have any updates on this one? Work around? Fix? Thanks in advance!