typescript - Prisma დინამიკური ცხრილების სახელები - findMany შეცდომა


მეცდები შევქმნა ფუნქცია, რომელიც იღებს დინამიურ ცხრილის სახელს და ირჩევს მის ყველა მონაცემს Prisma-ს გამოყენებით NestJS-ში Typescript-თან ერთად.

import { Injectable } from '@nestjs/common';
import { Prisma } from '@internal/prisma/client';
import { PrismaService } from 'src/prisma/prisma.service';

@Injectable()
export class DbMigrationService {
  constructor(
    private readonly prisma: PrismaService,
  ) {}

  migrateTables() {
    this.getTableData(Prisma.ModelName.user);
  }

  async getTableData(tableName: Prisma.ModelName) {
    const data = await this.prisma[tableName].findMany();
    console.log(data);
  }
}

პრობლემა ის არის, რომ TypeScript იწვევს ამ შეცდომას:

error TS2349: This expression is not callable.
  Each member of the union type '(<T extends saldoFindManyArgs>(args?: SelectSubset<T, saldoFindManyArgs>) => CheckSelect<T, PrismaPromise<saldo[]>, PrismaPromise<...>>) | ... 50 more ... | (<T extends tipo_cabeloFindManyArgs>(args?: SelectSubset<...>) => CheckSelect<...>)' has signatures, but none of those signatures are compatible with each other.

37     this.prisma[tableName].findMany();

რა იქნებოდა საუკეთესო გზა ამის გამოსასწორებლად?

პასუხი #1

მე ვეძებდი და ამ პასუხზე გადავაწყდი. ჩემთვის არ იმუშავა, შესაძლოა სინტაქსი განაახლეს!!

რაც მე გამოვიყენე იყო უბრალოდ as დამატება და შემდეგ ჩემი არსებული ცხრილების რომელიმე სახელი, მაგრამ გთხოვთ გაითვალისწინოთ, რომ ეს არ იქნება კარგი, თუ ცხრილების სახელები შეიცვლება. ასევე, გაერთიანებული ტიპები ვერ მუშაობს, იმიტომ რომ typescript ვერ შეძლებს ტიპის შეზღუდვას და დამატებით შეცდომას გამოაყენებს!

თვითდე შეგიძლიათ გამოიყენოთ as any შემდეგნაირად:

await (prisma[tableName] as any).findUnique({..})

პასუხი #2

მე ასე ვიფიქრე

const tableName = req.params.tableName;
const data = await prisma[`${tableName}`].findMany();