Type alias נותן שם לטיפוס. כותבים type Name = ..., ומאותו רגע אפשר להשתמש ב-Name בכל מקום שבו מצופה טיפוס. בניגוד ל-interface, alias יכול לתת שם לכל טיפוס שהוא, לא רק למבני אובייקטים.
Aliases קיימים רק בזמן קומפילציה. ה-JavaScript שנוצר לא מכיל אף אחת משורות ה-type האלה.
תחביר
type Name = SomeType;
type Name<T> = SomeTypeUsing<T>; // generic
export type Name = SomeType; // exported from a module
לפי המוסכמה, השמות נכתבים ב-PascalCase. הצד הימני הוא כל ביטוי טיפוס, ו-alias יכול להשתמש ב-aliases אחרים, כולל בעצמו (ראו טיפוסים רקורסיביים בהמשך). ה-alias זמין בכל ה-scope שבו הוא מוצהר, גם מעל שורת ההצהרה, כי טיפוסים נבדקים בזמן קומפילציה ולא מורצים לפי הסדר כמו const או let.
טיפוסי אובייקטים
עבור מבנה של אובייקט, alias ו-interface נכתבים כמעט באותה צורה. ה-alias משתמש ב-= ובדרך כלל מסתיים בנקודה-פסיק.
alias לא יכול להשתמש ב-extends; ה-intersection עם & ממלא את התפקיד הזה. בדיקות מאפיינים עודפים, מאפיינים אופציונליים ומאפייני readonly עובדים בדיוק כמו ב-interfaces. במה מהשניים לבחור למבני אובייקטים מוסבר בעמוד interface מול type.
Unions, tuples ופונקציות
אלה המקרים שרק alias יכול לתת להם שם, והסיבה העיקרית ש-type קיים. alias של union מפרט את האפשרויות, alias של tuple קובע את האורך ואת טיפוסי האיברים של מערך, ו-alias של פונקציה מתאר חתימה.
ב-scale הפרמטרים לא צריכים הערות טיפוס: ה-alias Transform מספק את הטיפוסים שלהם. התחביר של tuples מוסבר בעמוד tuples, וצמצום של unions בעמוד union types.
Type aliases גנריים
פרמטרי טיפוס מאפשרים ל-alias אחד לעבוד עם טיפוסים רבים. יכולים להיות להם ערכי ברירת מחדל, בדיוק כמו לפרמטרים של פונקציה.
Result<number> משתמש בברירת המחדל E = string. aliases גנריים קטנים כמו type Nullable<T> = T | null או type Dict<T> = Record<string, T> נפוצים בקוד אמיתי. גם טיפוסי העזר המובנים (Partial<T>, Pick<T, K>, ReturnType<F>) הם aliases גנריים, שמוצהרים בספרייה הסטנדרטית.
Aliases הם שמות, לא טיפוסים חדשים
alias לא יוצר טיפוס נפרד. הוא שם שני לטיפוס שבצד הימני, והקומפיילר מתייחס לשניהם כזהים. שני aliases של string ניתנים להחלפה לגמרי:
הקוד מדפיס cancelling u_42 בלי שגיאה, וזה בדיוק הבאג ש-alias לא יכול למנוע. ה-alias עדיין עוזר לקוראים (פרמטר מטיפוס OrderId אומר יותר מ-string), אבל אם בלבול בין שני מזהים חייב להיות שגיאת קומפילציה, השתמשו ב-branded type כמו string & { readonly __brand: "OrderId" }.
Type aliases רקורסיביים
alias יכול להפנות לעצמו, וכך מתארים עצים, רשימות מקוננות ו-JSON:
ה-alias Json דוחה ערכים ש-JSON לא יכול לייצג: השמה של { when: new Date() } או { f: undefined } ל-Json היא שגיאת קומפילציה (TS2322).
טיפוסים מתוך ערכים: typeof
כשערך כבר קיים, אפשר לתת שם לטיפוס שלו במקום לכתוב אותו מחדש. אופרטור הטיפוסים typeof קורא את הטיפוס של משתנה, ואפשר לשלב אותו עם אופרטורים אחרים:
const defaults = { retries: 3, verbose: false, level: "info" };
type Options = typeof defaults;
// { retries: number; verbose: boolean; level: string }
type OptionKey = keyof typeof defaults;
// "retries" | "verbose" | "level"
function start(port: number) {
return { port, startedAt: new Date() };
}
type Server = ReturnType<typeof start>;
// { port: number; startedAt: Date }
הערך נשאר מקור האמת היחיד: הוסיפו מאפיין ל-defaults ו-Options יתעדכן בהתאם. עוד על כך בעמוד typeof.
ייצוא וייבוא של aliases
מייצאים ומייבאים aliases כמו ערכים. import type מבהיר שמיובא רק טיפוס, ולכן ה-import תמיד מוסר מפלט ה-JavaScript:
// shapes.ts
export type Point = { x: number; y: number };
export type Shape = { kind: "circle"; center: Point; radius: number };
// main.ts
import type { Point, Shape } from "./shapes.js";
const p: Point = { x: 1, y: 2 };
שאלות נפוצות
מה זה type alias ב-TypeScript?
Type alias הוא שם לטיפוס, שמוצהר עם מילת המפתח type: type Point = { x: number; y: number }. מאותו רגע אפשר להשתמש ב-Point בכל מקום שבו מצופה טיפוס. אפשר לתת בו שם לכל טיפוס: מבנה של אובייקט, union, tuple, חתימה של פונקציה, טיפוס פרימיטיבי או טיפוס גנרי.
האם type alias יוצר טיפוס חדש?
לא. alias הוא רק שם נוסף לטיפוס קיים. עם type UserId = string ו-type OrderId = string, אפשר להעביר UserId במקום שבו מצופה OrderId, כי שניהם פשוט string. כדי ליצור טיפוסים שאינם ניתנים להחלפה, השתמשו ב-branded type.
האם type alias יכול להפנות לעצמו?
כן, כל עוד ההפניה העצמית נמצאת בתוך טיפוס אובייקט, מערך או tuple: type TreeNode = { value: number; children: TreeNode[] } ו-alias בשם Json שכולל Json[] עובדים שניהם. הפניה ישירה כמו type Loop = Loop | string היא השגיאה TS2456, Type alias 'Loop' circularly references itself.
האם type alias יכול להיות גנרי?
כן. כתבו פרמטרי טיפוס אחרי השם: type Box<T> = { value: T }, ואז השתמשו בו כ-Box<number>. לפרמטרים יכולים להיות ערכי ברירת מחדל (type Result<T, E = string> = ...) ואילוצים (type Keys<T extends object> = keyof T).
איך מקבלים טיפוס מאובייקט קיים?
השתמשו באופרטור הטיפוסים typeof: const defaults = { retries: 3, verbose: false }; type Options = typeof defaults; נותן { retries: number; verbose: boolean }. כך נשמר מקור אמת אחד כשהערך קיים קודם.