nestjs - TypeScript: Viedyt tyypit puutteellisia, kun käytetään Prisma-menetelmiä TurboRepossa


Kohtaan TypeScriptin tyyppipäätelmäongelman TurboRepo-asetuksessani, erityisesti käytettäessä Prisma-menetelmiä NestJS-palveluissa. Palvelinpaketissa minulla on export.d.ts-tiedosto, joka vie tyyppejä eri kontrollerimenetelmille ja DTO:ille. TypeScript ei kuitenkaan onnistu päättelemään täydellisiä tyyppejä käytettäessä Prisma-menetelmiä, mikä johtaa puutteellisiin tyyppimääritelmiin, kun niitä käytetään frontend-paketissa.

Palvelimen työtila:

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

auth.service.ts-tiedostossa TypeScript epäonnistuu päättelemään signin-metodin täydellisen vientipalautustyypin, kun käytetään this.prisma.staffUsers.findUnique. Vaikka TypeScript päättelee tyypit oikein, kun palautetaan objekteja suoraan AuthServicestä, se kamppailee Prisma-metodien perusteella pääteltyjen tyyppien kanssa. Se toimii odotetusti Server Workspace-ympäristössä, mutta ei päättelee täydellisesti, kun sitä käytetään frontend-työtilassa.

Esimerkki

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

Huomaa, että ongelma esiintyy vain, kun export.d.types -tiedostoja käytetään palvelinpaketin ulkopuolella, esimerkiksi Reactin frontend-paketissa, mutta ne toimivat odotetusti itse palvelinpaketissa.

Arvostaisin todella kaikkia ratkaisuja, ja kysy rohkeasti lisäselvityksiä tai resursseja asiaan liittyen.

Olen jo yrittänyt määritellä paluuarvotyypit eksplisiittisesti sign-metodiin, mutta en voi tehdä sitä täällä, koska Prismasta palautuvat tyypit ovat liian monimutkaisia ja niiden ylläpito monissa tilanteissa voi käydä hankalaksi.