מה strict באמת מפעיל
strict: true הוא קיצור לחבילת דגלים. החשובים:
strictNullChecks—nullו-undefinedהם טיפוסים נפרדים. זה 80% מהערך.noImplicitAny— פרמטר בלי טיפוס הוא שגיאה, לאanyשקט.strictFunctionTypes— בדיקת שונות (variance) נכונה של פונקציות.strictPropertyInitialization— מחלקה חייבת לאתחל שדות.useUnknownInCatchVariables—catch (e)הואunknown, לאany.
איך מהגרים בלי לעצור את הפיתוח
{
"compilerOptions": {
"strict": true,
"noUncheckedIndexedAccess": true
}
}
noUncheckedIndexedAccess הוא לא חלק מ-strict, והוא שווה הפעלה: arr[0] מחזיר T | undefined, כי אינדקס יכול להיות מחוץ לתחום. זה מרגיש מעצבן לשבוע, ואז מונע באגים אמיתיים.
הסדר שממזער כאב
- הפעילו
strict, קבלו רשימת שגיאות. - תקנו את הקלות (בעיקר
| undefinedשחסר). - בקבצים גדולים מדי —
// @ts-nocheckזמני עם משימה במעקב, לאanyבכל מקום. - כל קובץ שנוגעים בו — מסירים ממנו את ה-nocheck.
unknown הוא חבר, לא אויב
try {
await save();
} catch (error) {
if (error instanceof Error) log(error.message);
else log(String(error));
}
במצב strict, catch נותן unknown — וזה נכון, כי אפשר לזרוק כל דבר ב-JavaScript.
הדבר שהכי משפר קוד TypeScript
לא generics ולא utility types — אלא הסרת any מהחתימות של הפונקציות הציבוריות. כל any בחתימה מדביק את כל מי שקורא לה. התחילו מהפונקציות שנקראות הכי הרבה; יש סיכוי טוב שזה יוריד חצי מהשגיאות.
npx tsc --noEmit 2>&1 | grep -c "any" # לא מדויק, אבל נותן תחושה