nestjs - TypeScript: Jenis yang dieksport tidak lengkap apabila menggunakan kaedah Prisma dalam TurboRepo
Saya menghadapi isu inferens jenis TypeScript dalam setup TurboRepo saya, terutamanya semasa menggunakan kaedah Prisma dalam perkhidmatan NestJS. Dalam pakej server, saya mempunyai fail export.d.ts yang mengeksport jenis untuk pelbagai kaedah pengawal dan DTO. Walau bagaimanapun, TypeScript gagal untuk menginfer jenis sepenuhnya apabila menggunakan kaedah Prisma, yang mengakibatkan definisi jenis yang tidak lengkap apabila digunakan dalam pakej frontend.
Ruang Kerja Pelayan:
// 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 },
});
}
}
Dalam fail auth.service.ts, TypeScript gagal menafsirkan jenis pulangan eksport lengkap bagi kaedah signin apabila menggunakan this.prisma.staffUsers.findUnique. Walaupun TypeScript menafsirkan jenis dengan betul apabila mengembalikan objek secara langsung dari AuthService, ia menghadapi kesukaran dengan jenis yang ditafsirkan daripada kaedah Prisma. Ia berfungsi seperti yang dijangka di Server Workspace tetapi tidak menafsirkan dengan lengkap apabila digunakan di dalam ruang kerja frontend.
Contoh
// 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 },
});
}
Perlu diambil perhatian bahawa isu ini hanya berlaku apabila menggunakan export.d.types di luar pakej pelayan contohnya di dalam pakej frontend React tetapi berfungsi seperti yang dijangka dalam pakej pelayan itu sendiri.
Saya benar-benar menghargai sebarang penyelesaian dan sila jangan ragu untuk meminta sebarang penjelasan lanjut atau sumber berkaitan isu tersebut.
Saya telah mencuba untuk mentakrifkan jenis pemulangan secara jelas ke dalam kaedah sign tetapi saya tidak boleh berbuat demikian di sini kerana jenis yang dipulangkan dari Prisma terlalu kompleks dan mungkin menjadi sukar untuk dikendalikan dalam banyak senario.