NestJS Prisma — Типы объектов собственности, несовместимые, отсутствующие или не назначенные

#node.js #postgresql #nestjs #prisma

Вопрос:

Я пытаюсь обновить свою базу данных Postgres с помощью Prisma ORM в NestJS (архитектура микросервисов). Код позволяет пользователям взаимодействовать с запросами на приглашение. Но я продолжаю получать ошибку: Argument of type 'Invitation' is not assignable to parameter of type 'Invitation amp; { work: Work; }'. Property 'work' is missing in type 'Invitation' but required in type '{ work: Work; }' .

Полное сообщение об ошибке выглядит следующим образом:

Type '{ status: "PENDING" | "ACCEPTED" | "REJECTED"; work: undefined; id: string; workId: string; coId?: string; createdAt: Date; respondedAt?: Date; owner?: string; note?: string; }' is not assignable to type '(Without<InvitationUpdateInput, InvitationUncheckedUpdateInput> amp; InvitationUncheckedUpdateInput) | (Without<...> amp; InvitationUpdateInput)'.

Type '{ status: "PENDING" | "ACCEPTED" | "REJECTED"; work: undefined; id: string; workId: string; coId?: string; createdAt: Date; respondedAt?: Date; owner?: string; note?: string; }' is not assignable to type 'Without<InvitationUncheckedUpdateInput, InvitationUpdateInput> amp; InvitationUpdateInput'.

Type '{ status: "PENDING" | "ACCEPTED" | "REJECTED"; work: undefined; id: string; workId: string; coId?: string; createdAt: Date; respondedAt?: Date; owner?: string; note?: string; }' is not assignable to type 'Without<InvitationUncheckedUpdateInput, InvitationUpdateInput>'. Types of property 'workId' are incompatible. Type 'string' is not assignable to type 'never'.

Как я могу это исправить?

Заранее спасибо!

Интерфейс Приглашения:

 
export default class Invitation {
  id: string; 
  workId: string; 
  work: string;
  co?: string;
  status: RequestStatus;
  createdAt: Date;
  respondedAt?: Date;
  owner?: string;
  note?: string;
}

export enum RequestStatus {
  PENDING = 'PENDING',
  REJECTED = 'REJECTED',
  ACCEPTED = 'ACCEPTED',
}

 

Схема приглашения prisma:

 
model Invitation {
  id              String        @id @db.Uuid
  workId          String        @db.Uuid
  work            Work          @relation(...)
  status          RequestStatus
  co              String        @db.Uuid
  owner           String
  note            String  
  createdAt       DateTime
  respondedAt     DateTime  
}

 

Механизм обновления в инфраструктуре сохраняемости Postgres:

 
  async update(invitation: Invitation): Promise<Invitation> {
    const entity = await this.prismaService.invitation.update({
      where: {
        id: invitation.id,
      },
      data: {
        ...invitation,
        status: RequestStatusEntity[invitation.status],
        work: undefined,
      },
      include: {
        work: true,
      },
    });

    return this.toDomain(entity);
  }

  private toDomain(
    entity: InvitationEntity amp; {
      work: WorkEntity;
    },
  ): Invitation {
    return Object.setPrototypeOf(
      {
        ...entity,
        status: RequestStatus[entity.status],
      },
      Invitation.prototype,
    );
  }  

 

Комментарии:

1. Каково определение модели работы в вашем файле schema.prisma?

Ответ №1:

В этом случае вы не можете использовать перечисления машинописного текста, так как Prisma использует строковые литералы в сгенерированном типе.

Я бы предложил использовать типы Prisma напрямую, а не создавать свои собственные, как это:

 import { RequestStatus } from '@prisma/client'

export default class Invitation {
  id: string; 
  workId: string; 
  work: string;
  co?: string;
  status: RequestStatus;
  createdAt: Date;
  respondedAt?: Date;
  owner?: string;
  note?: string;
}