TypeScript - למי מיועדים קבצי *.d.ts?


במקרים רבים בדוגמאות TypeScript, קבצים מהסוג *.d.ts נוצרים אוטומטית בזמן הבנייה. חלק מהדוגמאות מדברות על הכרזות סביבתיות (ambient declarations). עם זאת, זה לא עוזר לי להבין את הרעיון והמשמעות מאחורי הקבצים האלו, כיוון שהם בעצם רק חוזרים על מה שכיתות אחרות כבר מכילות.

אז למה להתאמץ ליצור קבצי *.d.ts נוספים? איך הם עוזרים לי בתוך הקוד שלי?

תשובה #1

קבצי ההגדרה שנוצרים על ידי מהדר TypeScript הם אכן ברובם חזרה על הקוד שכתבת, אך עם כמה הבדלים בולטים:

  • הם לא מכילים מימוש, רק הכרזות
  • הם מכילים רק סוגים הנגישים לציבור

המקרה השימושי עבור קבצי ההצהרה הללו הוא להפצת ספריות. ניתן להפיץ ספריה ללא קוד TypeScript המקורי (כיוון שזה לא משנה בזמן הריצה בכל מקרה) ולהפיץ רק את JavaScript המהודרת. צרכני JavaScript ישתמשו ב-JavaScript ולא יפקפקו במקורה. גם צרכני TypeScript ישתמשו ב-JavaScript בזמן הריצה, אך קבצי .d.ts יאפשרו למרכיב הקומפיילר לבדוק את הקוד גם אם מקור TypeScript המקורי של הספריה אינו קיים.

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

תשובה #2

אם יש לך קובץ JavaScript ואתה רוצה להוסיף לו מידע סוג עשיר, אתה יכול לעשות זאת בקובץ הכרזה. זה כמו לפצל את TypeScript שלך לשני קבצים; קובץ JavaScript .js עם JavaScript רגיל בלבד, וקובץ הכרזה .d.ts עם כל מידע הסוגים.

זה אומר שיש חפיפה מסוימת בין הקבצים.

בדרך כלל, אם אתה כותב ספריית TypeScript אתה מייצר באופן אוטומטי את קובץ ה-JavaScript ואת קובץ ההצהרה ומחבץ אותם במקום קובץ ה-TypeScript המקורי. זה אומר שהספרייה יכולה להיות מנוצלת מתוך יישומי JavaScript ו-TypeScript ומאפשרת לספרייה הצרכנית להשתמש בגרסת TypeScript שונה מזו של הספרייה שלך.

אם יש לך קבצי JavaScript שברצונך לכלול בקומפילציה, אינך צריך ליצור קובץ הצהרה - סביבות פיתוח מאפשרות הסקה בסגנון TypeScript בתוך JavaScript (לדוגמה, VS Code מאפשרת את ההערה // @ts-check) והקומפיילר מאפשר לכלול JavaScript בקומפילציה אם אתה מעוניין בכך.