Utility Types
TypeScript מגיעה עם "פונקציות" מובנות לטיפוסים: מקבלות טיפוס קיים ומחזירות גרסה שלו. במקום לכתוב שוב ושוב גרסאות כמעט זהות של אותו אובייקט, גוזרים אותן מטיפוס אחד.
type User = {
id: number;
name: string;
email: string;
passwordHash: string;
createdAt: Date;
};
Partial ו-Required
// כל השדות אופציונליים: מושלם לעדכון חלקי
function updateUser(id: number, changes: Partial<User>) { /* ... */ }
updateUser(1, { name: 'דנה כהן' }); // ✅ לא צריך את כל השדות
// ההפך: כל השדות חובה
type Settings = { theme?: string; language?: string };
const defaults: Required<Settings> = { theme: 'light', language: 'he' };
Pick ו-Omit
// רק שדות מסוימים
type UserPreview = Pick<User, 'id' | 'name'>;
// כל השדות חוץ מ...
type PublicUser = Omit<User, 'passwordHash'>; // מה שמותר לשלוח ללקוח
// הנתונים ליצירת משתמש: בלי מה שהשרת ממלא לבד
type NewUser = Omit<User, 'id' | 'createdAt' | 'passwordHash'> & { password: string };
היתרון הגדול: מוסיפים שדה ל-User, וכל הטיפוסים הנגזרים מתעדכנים לבד.
Readonly
function printUser(user: Readonly<User>) {
user.name = 'x';
// Cannot assign to 'name' because it is a read-only property.
}
Record
type Status = 'draft' | 'published' | 'archived';
const statusColors: Record<Status, string> = {
draft: 'gray',
published: 'green',
archived: 'red',
};
ReturnType, Parameters ו-Awaited
function createStore() {
return { items: [] as string[], add(item: string) { /* ... */ } };
}
type Store = ReturnType<typeof createStore>; // הטיפוס שהפונקציה מחזירה
type AddParams = Parameters<Store['add']>; // [item: string]
type UserResult = Awaited<ReturnType<typeof fetchUser>>; // User, בלי ה-Promise
שימושי במיוחד כשהטיפוס מגיע מקוד שלא אתם כתבתם, ואין לו שם מיוצא.
Exclude, Extract ו-NonNullable
type Role = 'admin' | 'editor' | 'viewer';
type Staff = Exclude<Role, 'viewer'>; // 'admin' | 'editor'
type OnlyAdmin = Extract<Role, 'admin'>; // 'admin'
type Name = NonNullable<string | null | undefined>; // string
satisfies: לבדוק בלי לאבד פרטים
type Theme = Record<string, string>;
// עם : Theme היינו מאבדים את שמות המפתחות
const colors = {
primary: '#4f46e5',
danger: '#dc2626',
} satisfies Theme;
colors.primary; // ✅ TypeScript זוכרת שהמפתח קיים
colors.success;
// Property 'success' does not exist on type ...
satisfies בודק שהערך מתאים לטיפוס, אבל משאיר את הטיפוס המדויק שהוסק. אחד הכלים החדשים (TypeScript 4.9) והשימושיים ביותר.
סיכום
| צריך | משתמשים ב- |
|---|---|
| עדכון חלקי | Partial<T> |
| גרסה בלי שדות רגישים | Omit<T, K> |
| רק כמה שדות | Pick<T, K> |
| מילון עם מפתחות ידועים | Record<K, V> |
| טיפוס מתוך פונקציה קיימת | ReturnType, Parameters, Awaited |
בדקו את עצמכם
נסו לענות לבד לפני שאתם פותחים את התשובה.
-
איך מקבלים את User בלי השדה passwordHash?
הצגת התשובה
תשובה ד. Omit מסיר שדות, Pick משאיר רק את השדות שנבחרו.
-
לאיזה צורך מתאים
Partial<T>?הצגת התשובה
תשובה ג. למשל updateUser(id, { name: 'חדש' }).
-
מה עושה
satisfies?הצגת התשובה
תשובה ב. שונה מ-: Type, שמחליף את הטיפוס המוסק בטיפוס הכללי.