typescript - Prisma com GraphQL - como fornecer um tipo explícito para um array especificado de strings - problema de nomenclatura única
Estou tentando descobrir como especificar um tipo explícito para um campo, que é definido em um esquema do Prisma como tendo um valor de enum.
No meu esquema eu tenho:
enum Category {
CHANGE
OPTION
OTHER
}
e um modelo que usa Categoria da seguinte forma:
model Issue {
id String @id @default(dbgenerated("gen_random_uuid()")) @db.Uuid
title String
description String
category Category
Template Template[]
createdAt DateTime @default(now()) @db.Timestamptz(6)
updatedAt DateTime @default(now()) @updatedAt @db.Timestamptz(6)
User User[]
}
Então, no back-end, eu tenho um modelo:
import * as Prisma from "@prisma/client"
import { Field, ObjectType } from 'type-graphql'
import { BaseModel } from "../shared/base.model"
// - I tried this but it didn't help: import { Category } from "@generated"
@ObjectType()
export class Issue extends BaseModel implements Prisma.Issue {
@Field()
title: string
@Field()
description: string
@Field(() => Category)
category: Prisma.Category
}
e um arquivo de entrada que define ambos 'category', acho que estou fornecendo o tipo correto, referenciando o enum do Prisma (não tenho certeza se, em vez disso, devo referenciar os tipos gerados).
import { IsNotEmpty } from "class-validator"
import { Field, InputType } from "type-graphql"
import { Issue } from '../issue.model'
import * as Prisma from "@prisma/client"
@InputType()
export class IssueInput implements Partial<Issue> {
@Field()
@IsNotEmpty()
title: string
@Field()
@IsNotEmpty()
description: string
@Field()
@IsNotEmpty()
category: Prisma.Category
@Field()
@IsNotEmpty()
userId: string
}
Quando tento executar yarn dev com isto, recebo um erro que diz:
NoExplicitTypeError: Incapaz de inferir o tipo GraphQL a partir do sistema de reflexão do TypeScript. Você precisa fornecer um tipo explícito para 'category' da classe 'IssueInput'
Como posso descobrir como dar um tipo à categoria na classe IssueInput? Não consigo encontrar um exemplo de como fazer isso.
Eu tentei adicionar: registerEnumType tanto à definição de IssueInput quanto ao Modelo Issue, usando a ideia apresentada abaixo:
import { IsNotEmpty } from "class-validator"
import { Field, InputType, registerEnumType } from "type-graphql"
import { Issue } from '../issue.model'
import * as Prisma from "@prisma/client"
registerEnumType(Prisma.Category, {
name: "Category", // this one is mandatory
description: "Issue Category", // this one is optional
});
@InputType()
export class IssueInput implements Partial<Issue> {
@Field()
@IsNotEmpty()
title: string
@Field()
@IsNotEmpty()
description: string
@Field()
@IsNotEmpty()
category: Prisma.Category
@Field()
@IsNotEmpty()
userId: string
}
Eu ainda recebo um erro dizendo:
NoExplicitTypeError: Não foi possível inferir o tipo GraphQL a partir do sistema de reflexão do TypeScript. Você precisa fornecer um tipo explícito para 'category' da classe 'IssueInput'. em Object.findType
Quando tento assim como abaixo, recebo um erro no console que diz Erro: O esquema deve conter tipos com nomes exclusivos, mas contém vários tipos chamados "Category". Eu só tenho uma Category no arquivo de esquema.
Dentro do meu terminal, o erro é expresso de forma diferente, ele diz:
Propriedade 'category' no tipo 'IssueInput' não é atribuível à mesma propriedade no tipo base 'Partial'. Tipo 'Category' não é atribuível ao tipo 'Category | undefined'. Tipo '"CHANGE"' não é atribuível ao tipo 'Category | undefined'.
import { IsNotEmpty } from "class-validator"
import { Field, InputType, registerEnumType } from "type-graphql"
import { Issue } from '../issue.model'
import * as Prisma from "@prisma/client"
registerEnumType(Prisma.Category, {
name: "Category", // this one is mandatory
description: "Issue Category", // this one is optional
});
@InputType()
export class IssueInput implements Partial<Issue> {
@Field()
@IsNotEmpty()
title: string
@Field()
@IsNotEmpty()
description: string
@Field(type => Prisma.Category)
@IsNotEmpty()
category: Prisma.Category
// category: Prisma.Category | undefined -- this also does not solve the problem
@Field()
@IsNotEmpty()
userId: string
}
Resposta #1
Você precisa registrar o enum com type-graphql.
import { registerEnumType } from "type-graphql";
registerEnumType(Prisma.Category, {
name: "Category", // this one is mandatory
description: "Issue Category", // this one is optional
});
