Ricerca nel sito web

nestjs - TypeScript: Tipi esportati incompleti quando si utilizzano i metodi Prisma in TurboRepo


Sto riscontrando un problema di inferenza dei tipi in TypeScript nella mia configurazione TurboRepo, nello specifico quando utilizzo i metodi Prisma all'interno dei servizi NestJS. Nel pacchetto server, ho un file export.d.ts che esporta i tipi per vari metodi dei controller e DTO. Tuttavia, TypeScript non riesce a inferire tipi completi quando utilizza i metodi Prisma, risultando in definizioni di tipo incomplete quando vengono utilizzate nel pacchetto frontend.

Spazio di lavoro del server:

// 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 },
    });
  }
}

Nel file auth.service.ts, TypeScript non riesce a dedurre il tipo di ritorno completo dell'export del metodo signin quando si utilizza this.prisma.staffUsers.findUnique. Mentre TypeScript deduce correttamente i tipi quando si restituiscono oggetti direttamente dall'AuthService, ha difficoltà con i tipi dedotti dai metodi di Prisma. Funziona come previsto nel Server Workspace, ma non deduce completamente i tipi quando viene utilizzato all'interno del workspace frontend.

Esempio

// 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 },
  });
}

Nota che il problema si verifica solo quando si utilizzano i tipi export.d al di fuori del pacchetto server, ad esempio all'interno del pacchetto frontend React, ma funziona come previsto nel pacchetto server stesso.

Apprezzerei davvero qualsiasi soluzione e sentitevi liberi di chiedere ulteriori spiegazioni o risorse relative al problema.

Ho già provato a definire esplicitamente i tipi di ritorno nel metodo sign, ma non posso farlo qui perché i tipi restituiti da Prisma sono troppo complessi e potrebbero diventare difficili da mantenere in molti scenari.