מערכים, Tuples ו-Enums

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

מערכים

const scores: number[] = [90, 85, 77];
const names: Array<string> = ['דנה', 'יוסי'];   // אותו דבר, תחביר אחר

scores.push('מאה');
// Argument of type 'string' is not assignable to parameter of type 'number'.

const firstName = names[0];   // string
const mixed = [1, 'שתיים'];   // (string | number)[]

שני התחבירים זהים. number[] נפוץ יותר.

גישה לאינדקס שלא קיים

שימו לב: TypeScript מניחה ש-names[5] הוא string, למרות שבפועל הוא undefined. ההגדרה "noUncheckedIndexedAccess": true ב-tsconfig מתקנת את זה, ומכריחה לבדוק:

// עם noUncheckedIndexedAccess
const third = names[2];        // string | undefined
console.log(third?.length);    // ✅ צריך ?. או בדיקה

מערכים לקריאה בלבד

function average(values: readonly number[]): number {
    values.push(0);
    // Property 'push' does not exist on type 'readonly number[]'.
    return values.reduce((sum, value) => sum + value, 0) / values.length;
}

פונקציה שמקבלת readonly מבטיחה למי שקורא לה שהיא לא תשנה את המערך שלו.

Tuples: מערך עם מבנה קבוע

// בדיוק שני איברים: מספר ואז מחרוזת
let entry: [number, string] = [1, 'דנה'];

const [id, label] = entry;   // id: number, label: string

// עם שמות, לקריאוּת
type Point = [x: number, y: number];
const origin: Point = [0, 0];

אם זה מוכר לכם, זה בדיוק מה ש-useState ב-React מחזיר: [value, setValue].

Enums, והחלופה המודרנית

enum מגדיר קבוצה סגורה של ערכים עם שמות:

enum Role {
    Admin = 'admin',
    Editor = 'editor',
    Viewer = 'viewer',
}

const role: Role = Role.Editor;

ב-2026 רוב הצוותים מעדיפים איחוד של ערכים (Literal Union), מכמה סיבות: הוא לא מייצר קוד JavaScript נוסף, הוא עובד כשמריצים .ts ישירות ב-Node.js (ששם enum לא נתמך), והוא פשוט יותר:

type Role = 'admin' | 'editor' | 'viewer';

const role: Role = 'editor';   // מחרוזת רגילה, עם בדיקה

צריכים גם רשימה של הערכים בזמן ריצה (למשל לתפריט)? as const:

const ROLES = ['admin', 'editor', 'viewer'] as const;
type Role = (typeof ROLES)[number];   // 'admin' | 'editor' | 'viewer'

ROLES.forEach((role) => console.log(role));   // עובד גם בזמן ריצה

as const אומר: "זה לא סתם מערך של מחרוזות, אלה בדיוק הערכים האלה, ואי אפשר לשנות אותם".

סיכום

  • string[] למערך, readonly string[] כשלא משנים אותו.
  • Tuple כשהמבנה קבוע: [number, string].
  • במקום enum: type Role = 'a' | 'b', ו-as const כשצריך את הרשימה בזמן ריצה.

בדקו את עצמכם

נסו לענות לבד לפני שאתם פותחים את התשובה.

  1. מה הטיפוס של [number, string]?

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

    תשובה א. Tuple מגדיר אורך וסדר קבועים.

  2. מה החלופה המודרנית הנפוצה ל-enum?

    1. איחוד של ערכים: type Role = 'admin' | 'viewer'
    2. any
    3. interface
    4. class
    הצגת התשובה

    תשובה א. הוא לא מייצר קוד, ועובד כשמריצים .ts ישירות ב-Node.js.