חבירת טיפוסי TypeScript מתוך סביבת עבודה מקומית של Yarn עם Rollup


יש לי מונורפו, שנוצר כ-Yarn Workspace, שיש לו API ו-SDK.

ה-API הוא הצד האחורי, וה-SDK הוא ספרייה מתוקה לאינטראקציה עם אותו צד אחורי. ה-API הוא חבילה פרטית בעוד שה-SDK יתפרסם ויהיה זמין לכל אחד. שניהם כתובים ב-TypeScript.

באופן טבעי, ל-SDK ול-API יש חפיפה מסוימת כשמדובר בסוגי TypeScript. מכיוון שה-API מגדיר מה הוא מקבל כארגומנטים לנקודות הקצה שלו, נראה שהכי טוב להשתמש מחדש בסוגים הללו ב-SDK כדי להגדיר מה ה-SDK צריך "לשלוח" ל-API.

אני בהחלט יכול לייצא סוגים אלה מה-API, ולייבא אותם ב-SDK:

// api/src/index.ts
export type EndpointArgumentType = {
  resourceId: string
  body: Record<string, unknown>
}
// sdk/src/index.ts
import { EndpointArgumentType } from 'api'

עם זאת, כאשר אני אוגד את ה-SDK עם Rollup, אני נתקל בקשיים לוודא שסוגי ה-API נכללים כראוי בחבילת ה-SDK המתקבלת. הפניות ל-EndpointArgumentType אכן נוכחות בקובץ index.d.ts של החבילות, אך הן דורשות גישה ל-API כתלות חיצונית. הקוד בפועל דומה מאוד לזה של קוד המקור:

// sdk/lib/index.d.ts
import { EndpointArgumentType } from 'api';

זה לא טוב, כיוון שה-API לא יהיה זמין לציבור ולכן החיפוש ייכשל כאשר הספרייה תישמש מחוץ למסגרת העבודה שלי.

איך אני יכול לארוז טיפוסי TypeScript של תלות מקומית בתוך חבילה? ברור שאיני רוצה שום חלק מהלוגיקה העסקית מה-API (כיוון שזה לא צריך להיות ציבורי), אני רק צריך שהטיפוסים יוכרזו בתוך החבילה של ה-SDK שלי.

הרכבתי דוגמה קטנה מאוד שניתנת לשחזור כרפוזיטורי ב-Github, לכל מי שרוצה להתנסות ולנסות לגרום לזה לעבוד.