Menu

הערות ב-TypeScript: JSDoc, @ts-ignore ו-@ts-expect-error

TypeScript משתמשת בהערות // ו-/* */ של JavaScript, ובנוסף בהערות JSDoc מסוג /** */ שעורכים מציגים כשמרחפים מעל קוד. היא קוראת גם כמה הערות מיוחדות: @ts-expect-error, @ts-ignore, @ts-nocheck, @ts-check והנחיות /// <reference>.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

הערות ב-TypeScript הן הערות של JavaScript: // להמשך השורה ו-/* */ לבלוק. הערת בלוק שמתחילה ב-/** היא הערת תיעוד (JSDoc), שעורכים מציגים כשמרחפים מעל מה שהיא מתעדת. מעבר לזה, TypeScript קוראת כמה הערות מיוחדות שמשנות את האופן שבו הקומפיילר בודק את הקוד שלכם.

פלט:

212

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

הערות של שורה אחת והערות בלוק

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

הערות בלוק לא מקוננות. ה-*/ הראשון מסיים את ההערה, ולכן עטיפה של קוד שכבר מכיל הערת בלוק נשברת:

/* outer comment /* inner comment */ this text is now code */

אז הקומפיילר מנסה לקרוא את this text is now code */ כקוד ומדווח על שגיאת תחביר. כדי להפוך להערה אזור שמכיל הערות בלוק, השתמשו ב-// בכל שורה; רוב העורכים עושים את זה עם Ctrl+/ (Cmd+/ ב-macOS).

הערות תיעוד JSDoc

הערת /** ... */ מיד לפני פונקציה, מחלקה, מתודה, מאפיין, interface או משתנה מתעדת אותם. עורכים מציגים את הטקסט שלה בחלונית הריחוף ובהשלמה האוטומטית, וכלים ליצירת תיעוד כמו TypeDoc הופכים אותה לעמודי עיון. TSDoc, תקן להערות האלה בקוד TypeScript שהתחיל ב-Microsoft, משתמש באותו תחביר לתגיות הנפוצות:

תגיתמשמעות
@param name descriptionמתארת פרמטר
@returns descriptionמתארת את ערך ההחזרה
@throws descriptionמתארת שגיאה שהפונקציה יכולה לזרוק
@exampleמתחילה בלוק דוגמה, ובדרך כלל אחריה בא בלוק קוד
@deprecated reasonמסמנת API כמיושן; עורכים מציגים אותו עם קו חוצה
@see או {@link Name}מפנה לקוד קשור
@remarksהסבר ארוך יותר אחרי שורת הסיכום

בקובץ .ts, אל תחזרו על הטיפוסים ב-JSDoc. הערות הטיפוס בקוד הן הטיפוסים, ותגיות טיפוס של JSDoc לא משפיעות שם: /** @type {string} */ const v: number = 5; עובר קומפילציה בלי תלונה, כי רק : number נחשב.

בעורך, ריחוף מעל transfer או balance בכל מקום בפרויקט מציג את התיאורים האלה.

סימון קוד כמיושן

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

פלט:

$19.99
19.99 EUR

@ts-expect-error ו-@ts-ignore

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

פלט:

runtime error: text.toUpperCase is not a function

בלי ההערה, shout(42) היא שגיאת קומפילציה (TS2345). איתה, הקובץ עובר קומפילציה והקריאה מגיעה לזמן הריצה, וזו כל המטרה של הבדיקה הזו.

ההבדל בין שתי ההנחיות מתגלה כשהשגיאה נעלמת. @ts-expect-error מתעקשת שתהיה שגיאה להשתיק, ולכן הערה שהתיישנה הופכת בעצמה לשגיאה:

index.ts(6,1): error TS2578: Unused '@ts-expect-error' directive.

// @ts-ignore באותו מקום נשארת שקטה, גם כשהשגיאה קיימת וגם אחרי שהיא נעלמה. בגלל זה @ts-expect-error היא ברירת המחדל הטובה יותר: כשמישהו מתקן את הטיפוסים, הקומפיילר אומר לכם שאפשר להסיר את ההשתקה. תמיד הוסיפו סיבה אחרי ההנחיה, כמו בדוגמה למעלה, כדי שהקורא הבא יידע למה היא שם.

שתיהן מכסות רק את השורה הבאה ואת כל השגיאות בה. כשצריך לעקוף ערך שלם, as unknown as T מפורש או בדיקת זמן ריצה בדרך כלל ברורים יותר מהערת השתקה.

@ts-nocheck ו-@ts-check

// @ts-nocheck בראש קובץ מכבה את בדיקת הטיפוסים לכל הקובץ. היא חייבת לבוא ראשונה, לפני כל קוד: אם היא נמצאת נמוך יותר, מתעלמים ממנה והשגיאות עדיין מופיעות.

// @ts-nocheck
const n: number = "not a number"; // no error reported

היא שימושית בזמן מיגרציה של בסיס קוד JavaScript גדול, וסימן אזהרה בכל מקום אחר.

// @ts-check עושה את ההפך בקובץ JavaScript: היא מפעילה בדיקת טיפוסים לקובץ ה-.js הזה, בעזרת הסקה וטיפוסי JSDoc, גם כש-checkJs כבוי ב-tsconfig.json (הקובץ עדיין צריך להיות חלק מהפרויקט, דרך allowJs):

// @ts-check

/**
 * @param {number} cents
 * @returns {string}
 */
function formatCents(cents) {
    return (cents / 100).toFixed(2);
}

formatCents("12"); // error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

בקבצי JavaScript תגיות ה-JSDoc הן הטיפוסים, וכך פרויקטים רבים מקבלים בדיקת טיפוסים בלי להמיר קבצים ל-.ts.

הנחיות Triple-Slash

הערה מהצורה /// <reference ... /> ממש בראש קובץ היא הנחיה לקומפיילר:

/// <reference types="node" />
/// <reference lib="es2023.array" />
/// <reference path="./globals.d.ts" />
  • types="node" מוסיפה חבילת @types לתוכנית, כמו רישום שלה ב-"types" ב-tsconfig.json.
  • lib="..." מוסיפה ספרייה מובנית לתוכנית, כמו האפשרות lib.
  • path="..." כוללת קובץ אחר, בעיקר בתוך קבצי .d.ts.

בקוד של אפליקציה, פקודות import והגדרות ב-tsconfig.json מחליפות כמעט כל שימוש; בדרך כלל פוגשים את ההנחיות האלה בקבצי הצהרה ובקוד שנוצר אוטומטית, כמו vite-env.d.ts של Vite. כהדגמה מהירה, lib הופכת מתודת מערך חדשה יותר לזמינה בקובץ הזה:

הערות בפלט המקומפל

tsc שומר הערות ב-JavaScript שהוא כותב. הגדירו "removeComments": true כדי להסיר אותן; הערות שמתחילות ב-/*! שורדות גם אז, וזו המוסכמה לכותרות רישיון:

/*! MyLib v1.2.0 | MIT License */

הערות JSDoc מועתקות גם לקבצי .d.ts כש-declaration פעיל, וכך משתמשים בספרייה רואים את התיאורים בעורך שלהם.

שאלות נפוצות

איך כותבים הערה ב-TypeScript?

בדיוק כמו ב-JavaScript: // מתחיל הערה שנמשכת עד סוף השורה, ו-/* ... */ עוטף הערה שיכולה להתפרס על כמה שורות. הערת בלוק שמתחילה ב-/** היא הערת תיעוד (JSDoc), שעורכים מציגים כשמרחפים מעל הפונקציה, המחלקה או המאפיין שהיא מתעדת.

מה ההבדל בין @ts-ignore ל-@ts-expect-error?

שתיהן משתיקות את שגיאות הטיפוסים בשורה הבאה. // @ts-expect-error גם בודקת שיש שם שגיאה: אם השורה מפסיקה להכיל שגיאה, הקומפיילר מדווח error TS2578: Unused '@ts-expect-error' directive., וכך השתקות ישנות לא נשכחות. // @ts-ignore נשארת שקטה לתמיד. העדיפו את @ts-expect-error.

איך מתעלמים משגיאות TypeScript בקובץ שלם?

שימו // @ts-nocheck בראש הקובץ, לפני כל קוד. אז הקומפיילר לא מדווח על שגיאות טיפוסים בקובץ הזה (שגיאות תחביר עדיין מופיעות). זה כלי למיגרציה; לשורה אחת השתמשו במקום זה ב-// @ts-expect-error.

האם הערות מגיעות ל-JavaScript המקומפל?

כן, כברירת מחדל tsc שומר הערות בפלט. עם "removeComments": true הוא מסיר אותן, חוץ מהערות שמתחילות ב-/*!, שנשמרות בשביל כותרות רישיון. bundlers ו-minifiers בדרך כלל מסירים אותן ב-builds של production.

האם כדאי לכתוב טיפוסים בהערות JSDoc בקובץ .ts?

לא. בקבצי .ts, תגיות טיפוס של JSDoc כמו @type {string} או @param {number} x לא משפיעות על בדיקת הטיפוסים; הערות הטיפוס בקוד הן הטיפוסים. השתמשו ב-JSDoc בקבצי .ts לתיאורים, ובטיפוסי JSDoc רק בקבצי .js שנבדקים עם // @ts-check או checkJs.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל