nestjs - TypeScript: סוגי הייצוא לא שלמים בעת שימוש בשיטות של Prisma ב-TurboRepo
אני נתקל בבעיה של אינפרנציה של טיפוס ב-TypeScript בהגדרת TurboRepo שלי, במיוחד כאשר אני משתמש בשיטות של Prisma בתוך שירותי NestJS. בחבילת השרת, יש לי קובץ export.d.ts שמייצא טיפוסים עבור שיטות שונות של בקר ו-DTOs. עם זאת, TypeScript לא מצליח להסיק טיפוסים מלאים כאשר משתמשים בשיטות של Prisma, מה שמוביל להגדרות טיפוס לא מלאות כאשר משתמשים בהן בחבילת ה-frontend.
סביבת עבודה של שרת:
// 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, TypeScript נכשל בהסקת סוג החזרת הייצוא המלא של מתודת signin כאשר משתמשים ב-this.prisma.staffUsers.findUnique. בעוד ש-TypeScript מסיק נכונה סוגים כאשר מחזירים אובייקטים ישירות מה-AuthService, הוא מתקשה עם סוגים שהוסקו ממתודות Prisma. זה פועל כצפוי ב-Server Workspace אך לא מסיק את המלא כאשר משתמשים בתוך סביבת העבודה של ה-front-end.
דוגמא
// 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 },
});
}
שים לב שהבעיה מתרחשת רק כאשר משתמשים ב-export.d.types מחוץ לחבילת השרת, לדוגמה בתוך חבילת ה-frontend של React, אך עובדת כצפוי בתוך חבילת השרת עצמה.
אני אעריך מאוד כל פתרון ובבקשה אל תהססו לשאול עבור כל הסבר נוסף או משאבים הקשורים לבעיה.
כבר ניסיתי להגדיר סוגי החזרה במפורש בתוך המתודה sign אבל אני לא יכול לעשות את זה כאן כי הסוגים שמוחזרים מפריזמה מורכבים מדי ועלולים להפוך למסורבלים לתחזוקה במצבים רבים.