TypeScript היא JavaScript עם טיפוסים סטטיים. מוסיפים הערות טיפוסים למשתנים, לפרמטרים ולערכי החזרה, הקומפיילר של TypeScript בודק אותן לפני שהתוכנית רצה, ומוציא JavaScript רגיל בלי הטיפוסים. ה-JavaScript הזה רץ בכל מקום ש-JavaScript רצה בו: בדפדפנים, ב-Node.js, ב-Deno וב-Bun.
הנה תוכנית TypeScript קטנה. לחצו על Run.
פלט:
Ada is 36 years old
82.33333333333333
חוץ מהחלקים שאחרי הנקודתיים (: string, : User, : number[]) ומה-interface, זה JavaScript. התוספות האלה אומרות לקומפיילר מה כל ערך רשאי להיות. שימו לב של-total אין הערת טיפוס: TypeScript מבינה לבד שזה מספר. רוב קוד ה-TypeScript מסמן טיפוסים בגבולות של פונקציות ונותן לקומפיילר להסיק את השאר.
מה בודק הטיפוסים תופס
המטרה של הערות הטיפוסים היא שטעויות יופיעו בזמן שכותבים את הקוד, ולא כשמשתמש נתקל בהן. הריצו את הבלוק הזה וקראו את הפלט:
התוכנית לא מתחילה לרוץ בכלל. במקום זה הקומפיילר מדפיס שתי שגיאות:
index.ts(11,38): error TS2322: Type 'string' is not assignable to type 'number'.
index.ts(12,22): error TS2741: Property 'age' is missing in type '{ name: string; }' but required in type 'User'.
כל שגיאה מציינת את הקובץ, את השורה והעמודה, קוד שגיאה (TS2322) ומה לא בסדר. ב-JavaScript רגיל שתי השורות היו רצות, והשנייה הייתה מדפיסה Linus is undefined years old בלי שום אזהרה. בעורך כמו VS Code אותן שגיאות מופיעות כקו תחתון אדום בזמן ההקלדה, יחד עם השלמה אוטומטית שיודעת של-user יש בדיוק name ו-age.
באגים נפוצים שבודק הטיפוסים תופס:
- שם של property או של מתודה עם שגיאת כתיב (
user.nmae,list.lenght). - קריאה לפונקציה עם מעט מדי או יותר מדי ארגומנטים, או עם ארגומנטים מהטיפוס הלא נכון.
- שימוש בערך שעלול להיות
nullאוundefinedבלי לבדוק אותו קודם. - שכחה לטפל באחד המקרים של union כמו
"loading" | "done" | "error", כשהקוד משתמש בבדיקה ממצה. - קוד שנשבר כשפונקציה שהוא תלוי בה משנה את החתימה שלה.
הטיפוסים נעלמים בזמן ריצה
הטיפוסים של TypeScript קיימים רק בזמן הקומפילציה. הקומפיילר בודק אותם ואז מסיר אותם: ל-JavaScript שהוא מוציא אין הערות טיפוסים ואין interfaces, והוא רץ בדיוק כמו JavaScript שנכתב ביד.
הקלט הזה:
function double(n: number): number {
return n * 2;
}
הופך לפלט הזה:
function double(n) {
return n * 2;
}
לכן TypeScript לא יכולה לבדוק ערכים שמגיעים בזמן שהתוכנית רצה. כאן טקסט ה-JSON טוען שהוא User, הקומפיילר חייב לסמוך על הטענה הזו, וגם בזמן ריצה שום דבר לא מתלונן:
פלט:
string
thirty-six1
נתונים שמגיעים מחוץ לתוכנית (תשובות מ-API, קלט מטפסים, קבצים) צריכים בדיקה בזמן ריצה, למשל פונקציית type guard שבודקת את הערך. אחרי זה TypeScript סומכת על הבדיקה ומצמצמת את הטיפוס בשבילכם.
מי יצר את TypeScript ולמה
TypeScript נוצרה ב-Microsoft, ואת התכנון הוביל Anders Hejlsberg (מי שתכנן את C#). היא שוחררה לציבור באוקטובר 2012 כגרסה 0.8, וגרסה 1.0 הגיעה באפריל 2014. היא קוד פתוח ברישיון Apache 2.0 ומפותחת ב-GitHub. לפי הספירה של GitHub של תורמים חודשיים, TypeScript הפכה באוגוסט 2025 לשפה הנפוצה ביותר ב-GitHub, לפני Python ו-JavaScript.
המניע היה בסיסי קוד גדולים של JavaScript. ב-JavaScript אין דרך לומר "הפונקציה הזו מקבלת אובייקט משתמש", ולכן שינוי שם של property או שינוי של פונקציה חייבו לחפש בכל הקוד ולקוות שהבדיקות מכסות כל מקום שקורא לה. TypeScript מוסיפה את המידע הזה בדרך ששומרת על תאימות מלאה ל-JavaScript:
- היא superset. JavaScript תקין הוא תחביר TypeScript תקין, כך שפרויקט יכול לעבור קובץ אחרי קובץ.
- היא הולכת בעקבות JavaScript. חוץ מכמה תוספות מוקדמות כמו
enumו-namespace, TypeScript לא מוסיפה יכולות משלה בזמן ריצה; תחביר חדש מגיע מהתקן של JavaScript. - הטיפוסים לא עולים כלום בזמן ריצה. הם נמחקים, כך שהפלט מהיר בדיוק כמו JavaScript שנכתב ביד.
הגרסה הראשית הנוכחית היא TypeScript 7, שהקומפיילר שלה נכתב מחדש ב-Go כתוכנית native, והוא בודק טיפוסים בפרויקטים גדולים מהר פי עשרה בערך מהקומפיילר מבוסס ה-JavaScript שהוא החליף. העמוד על TypeScript 7 מסביר מה השתנה.
למה משתמשים ב-TypeScript? Frontend ו-backend
משתמשים ב-TypeScript לאותה תוכנה שכותבים ב-JavaScript, גם ב-frontend וגם ב-backend. מכיוון שהפלט הוא JavaScript, TypeScript הולכת לכל מקום ש-JavaScript הולכת אליו:
| איפה | איך TypeScript רצה שם |
|---|---|
| ממשקי frontend בדפדפן | כלי build (Vite, webpack, esbuild) מקמפל אותה ל-JavaScript. React, Angular, Vue ו-Svelte תומכים בה; פרויקטים של Angular כתובים ב-TypeScript כברירת מחדל. |
| שרתים וסקריפטים ב-Node.js | מקמפלים עם tsc ומריצים את פלט ה-.js, או מריצים קובצי .ts ישירות: גרסאות Node.js עדכניות מסירות את הטיפוסים בעצמן. |
| Deno | מריץ קובצי .ts ישירות; deno check בודק את הטיפוסים שלהם. |
| Bun | מריץ קובצי .ts ישירות, בלי בדיקת טיפוסים. |
| דסקטופ ומובייל | Electron, React Native וכלים דומים מקבלים TypeScript. |
אותה שפה מכסה את שני הצדדים של אפליקציית ווב, ולכן צוותים רבים משתפים הגדרות טיפוסים (למשל את המבנה של תשובת API) בין הקוד של השרת לקוד של הדפדפן.
איך קוד TypeScript הופך ל-JavaScript
יש שתי משימות נפרדות, וכלים שונים עושים כל אחת מהן:
- בדיקת טיפוסים. רק הקומפיילר של TypeScript עושה את זה, בדרך כלל בתור הפקודה
tsc(הפקודהdeno checkשל Deno מריצה עותק של אותו קומפיילר). הוא קורא את קובצי ה-.tsשלכם, מדווח על שגיאות, וכברירת מחדל גם כותב קובצי.js. - הסרת הטיפוסים.
tscיכול לעשות את זה, וגם כלים מהירים יותר שמדלגים לגמרי על בדיקת הטיפוסים: esbuild, SWC, Babel, וה-type stripping שמובנה ב-Node.js, ב-Deno וב-Bun.
הגדרה נפוצה משתמשת בכלי מהיר כדי להריץ את הקוד, וב-tsc --noEmit (רק בדיקה, בלי לכתוב כלום) בעורך וב-CI. להתקנת tsc ולהרצת קובץ .ts יש לכל אחד עמוד משלו בפרק הזה.
היכולות המרכזיות בדוגמה אחת
TypeScript של יום יום משתמשת בקבוצה קטנה של יכולות. הבלוק הזה מרכז את העיקריות שבהן:
פלט:
Ada ada@example.com
Ada can log in
Linus is banned
- הערות טיפוסים (
name: string) מציינות מה מכיל משתנה, פרמטר, property או ערך החזרה. - הסקת טיפוסים משלימה את הטיפוסים שלא כתבתם:
accountמקבל את הטיפוס שלו ממה ש-firstמחזירה. - Interfaces ו-type aliases (
interface Account,type Status) נותנים שם למבנה של הנתונים שלכם. - טיפוסי union (
"active" | "banned",T | undefined) מתארים ערך שהוא אחד מכמה דברים. - Narrowing: אחרי בדיקה כמו
account !== undefined, הקומפיילר יודע איזה מקרה חל בתוך הבלוק. - Properties אופציונליים (
email?: string) יכולים להיות חסרים, ולכן הטיפוס שלהם כוללundefined. - Generics (
first<T>) מאפשרים לפונקציה או לטיפוס אחד לעבוד עם הרבה טיפוסים ולשמור על הקשר ביניהם: נכנס מערך שלAccount, יוצאAccount.
צריך ללמוד JavaScript קודם?
זה עוזר, אבל אפשר ללמוד את שתיהן במקביל. כל מה שקובע איך קוד TypeScript מתנהג בזמן ריצה (משתנים, פונקציות, אובייקטים, מערכים, promises, מחלקות) הוא JavaScript, ו-TypeScript מוסיפה שכבה שמתארת את הערכים האלה. אם אתם כבר יודעים JavaScript, החומר החדש הוא מערכת הטיפוסים: הערות טיפוסים, interfaces, unions, generics ו-narrowing. אם שתיהן חדשות לכם, התחילו מהבסיס של ערכים ופונקציות ב-JavaScript, והוסיפו טיפוסים תוך כדי; הודעות השגיאה של הקומפיילר הן מורה טוב, כי הן מצביעות על השורה המדויקת שבה ערך משמש בצורה לא נכונה.
סדר מעשי ללימוד TypeScript: התקינו אותה והריצו קובץ ראשון, למדו את הטיפוסים הבסיסיים ואת טיפוסי האובייקטים, אחר כך טיפוסי union ו-narrowing, ואחרי זה פונקציות ו-generics. זה מכסה את רוב הקוד של אפליקציות.
שאלות נפוצות
מה זה TypeScript במילים פשוטות?
TypeScript היא JavaScript עם הערות טיפוסים. כותבים let count: number = 0, וקומפיילר בודק ש-count משמש תמיד רק כמספר. אחר כך הקומפיילר מסיר את הערות הטיפוסים ומוציא JavaScript רגיל, כך שכל מה שמריץ JavaScript יכול להריץ את התוצאה.
האם TypeScript היא frontend או backend?
שניהם. TypeScript עוברת קומפילציה ל-JavaScript, ולכן היא הולכת לכל מקום ש-JavaScript הולכת אליו: ממשקי frontend בדפדפן (React, Angular, Vue, Svelte), שרתים על Node.js, Deno או Bun, כלי שורת פקודה ואפליקציות דסקטופ שנבנו עם Electron. בדיקת הטיפוסים עובדת אותו דבר בכולם.
האם TypeScript היא שפת תכנות או framework?
שפת תכנות. היא superset של JavaScript: כל תוכנית JavaScript היא תחביר TypeScript תקין, ו-TypeScript מוסיפה מעליה מערכת טיפוסים. היא לא framework ולא ספרייה: הערות הטיפוסים מוסרות בזמן הקומפילציה ולא מוסיפות קוד לתוכנית.
מי יצר את TypeScript?
Microsoft. את התכנון הוביל Anders Hejlsberg, שתכנן גם את C#. TypeScript שוחררה לציבור באוקטובר 2012 כגרסה 0.8, והיא קוד פתוח ברישיון Apache 2.0.
האם TypeScript בודקת טיפוסים בזמן ריצה?
לא. כל בדיקת הטיפוסים מתבצעת בזמן הקומפילציה, והטיפוסים נמחקים מפלט ה-JavaScript. אם לנתונים שמגיעים מחוץ לתוכנית (תשובה מ-API, טופס, קובץ JSON) יש מבנה שגוי, TypeScript לא יכולה להבחין בזה בזמן שהתוכנית רצה. בדקו את הנתונים האלה עם קוד שרץ בזמן ריצה, למשל type guard.