nestjs - TypeScript: Izvezeni tipovi nepotpuni pri korištenju Prisma metoda u TurboRepo


Susrećem se s problemom zaključivanja tipova u TypeScriptu u svom TurboRepo postavu, posebno pri korištenju Prisma metoda unutar NestJS servisa. U server paketu imam datoteku export.d.ts koja eksportira tipove za različite metode kontrolera i DTO-ove. Međutim, TypeScript ne uspijeva pravilno zaključiti sve tipove pri korištenju Prisma metoda, što rezultira nepotpunim definicijama tipova kada se koriste u frontend paketu.

Radni prostor poslužitelja:

// export.d.ts

import { AuthController } from './auth.controller';
import { SignInDto } from './auth.dto';

export * from './auth.controller';

// Partially exporting automatically typed return type
type Wrapper<T extends (...args: any) => any> = Awaited<ReturnType<T>>;

export namespace ApiTypes {
  export interface SignInPayload extends SignInDto {}
  export interface SignInResponse extends Wrapper<typeof AuthController.prototype.signin> { token: string }
}
// auth.service.ts

@Injectable()
export class AuthService {
  constructor(private prisma: PrismaClient) {}

  async signin(payload: SignInDto) {
    // Using Prisma method
    return await this.prisma.staffUsers.findUnique({
      where: { username: payload.identifier },
    });
  }
}

U datoteci auth.service.ts, TypeScript ne uspijeva dovršeno odrediti tip povratne vrijednosti metode signin kada se koristi this.prisma.staffUsers.findUnique. Dok TypeScript ispravno određuje tipove kada se objekti vraćaju izravno iz AuthService-a, ima poteškoća s tipovima koji se određuju iz Prisma metoda. Radi kako se očekuje u Server Workspace, ali ne određuje dovršeno kada se koristi unutar frontend workspace-a.

Primjer

// Returning hard object works fine even outside the server package.
// The types automatically inferred as Promise<{name:string;age:number}>
async signin(payload: SignInDto) {
  return { name: "Alice", age: 30 };
}



// But this does not work and infer type as Promise<any>
async signin(payload: SignInDto) {
  return await this.prisma.staffUsers.findUnique({
    where: { username: payload.identifier },
  });
}

Napomena da se problem javlja samo kada se koriste export.d.types izvan server paketa, npr. unutar react frontend paketa, ali radi očekivano unutar samog server paketa.

Zaista bih cijenio bilo kakva rješenja i slobodno pitajte za dodatna objašnjenja ili resurse vezane uz problem.

Već sam pokušao eksplicitno definirati tipove povratne vrijednosti u metodi sign, ali to ovdje ne mogu učiniti jer su tipovi koje vraća Prisma previše složeni i mogu postati nezgodni za održavanje u mnogim scenarijima.