Vyhledávání na webu

nestjs - TypeScript: Exportované typy neúplné při použití metod Prisma v TurboRepo


Setkávám se s problémem s odvozováním typů v TypeScriptu v mém nastavení TurboRepo, konkrétně při používání metod Prisma v rámci služeb NestJS. V balíčku serveru mám soubor export.d.ts, který exportuje typy pro různé metody kontrolerů a DTO. TypeScript však nedokáže odvodit kompletní typy při používání metod Prisma, což má za následek neúplné definice typů, když jsou používány v balíčku pro frontend.

Pracovní prostor serveru:

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

V souboru auth.service.ts TypeScript nedokáže odvodit úplný návratový typ metody signin při použití this.prisma.staffUsers.findUnique. Zatímco TypeScript správně odvozuje typy při přímém vracení objektů z AuthService, má problém s typy odvozenými z metod Prisma. Funguje to očekávaným způsobem ve Server Workspace, ale uvnitř frontendového workspace TypeScript úplný typ neodvodí.

Příklad

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

Vezměte na vědomí, že problém se vyskytuje pouze při používání export.d.types mimo serverový balíček, například uvnitř balíčku frontendového Reactu, ale v samotném serverovém balíčku funguje podle očekávání.

Opravdu bych ocenil jakákoli řešení a neváhejte se zeptat na další vysvětlení nebo zdroje související s tímto problémem.

Už jsem se pokusil explicitně definovat návratové typy v metodě sign, ale tady to nemohu udělat, protože typy vracené z Prisma jsou příliš složité a v mnoha scénářích by mohly být obtížné na údržbu.