Menu

טיפוסים ב-TypeScript: string, number, boolean ועוד

הטיפוסים המובנים של TypeScript: string, number, boolean, bigint, symbol, null ו-undefined, ובנוסף מבט מהיר על מערכים ואובייקטים. איך כותבים הערת טיפוס, למה אין טיפוס של מספר שלם, ולמה כותבים string ולא String.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

טיפוסים ב-TypeScript מתארים איזה סוג ערך משתנה יכול להחזיק. כותבים טיפוס אחרי נקודתיים, let name: string, והקומפיילר דוחה כל קוד ששם שם ערך מהסוג הלא נכון. הטיפוסים הבסיסיים הם שבעת הפרימיטיביים של JavaScript, ובנוסף טיפוסי אובייקט למערכים ולאובייקטים.

הערות הטיפוס נבדקות בזמן קומפילציה ואז מוסרות. התוכנית שרצה היא JavaScript רגיל.

הטיפוסים הפרימיטיביים

טיפוסערכים לדוגמההערות
string"hi", 'hi', `hi ${name}`טקסט. לכל שלושת סוגי המרכאות יש אותו טיפוס.
number42, 3.14, -0.5, NaN, Infinityכל מספר, שלם או לא. אין int או float.
booleantrue, falseרק שני הערכים האלה.
bigint10n, BigInt(10)מספרים שלמים בכל גודל. דורש target של ES2020 ומעלה.
symbolSymbol("id")ערך ייחודי, בעיקר בשימוש כמפתח של אובייקט.
nullnull"ריק בכוונה".
undefinedundefined"לא הוגדר". זה גם מה שמתקבל כשקוראים מאפיין חסר.

שמות הטיפוסים כתובים באותיות קטנות. typeof בזמן ריצה מחזיר את אותן מילים עבור רובם, ולכן typeof x === "number" היא הדרך לבדוק את הטיפוס הפרימיטיבי של ערך בזמן שהתוכנית רצה.

הערות טיפוס

הערת טיפוס היא : Type אחרי משתנה, פרמטר או רשימת הפרמטרים של פונקציה. בפרמטרים הערות הטיפוס הכי חשובות, כי TypeScript לא יכולה לנחש מה הקורא יעביר.

כשמשתנה מאותחל באותה שורה, הערת הטיפוס בדרך כלל מיותרת: ל-let count = 10 כבר יש את הטיפוס number. הכללים להשמטת טיפוסים נמצאים בעמוד הסקת טיפוסים.

טיפוס שגוי הוא שגיאת קומפילציה

השימו ערך מהטיפוס הלא נכון והקומפיילר עוצר לפני שמשהו רץ:

הקומפיילר מדפיס:

index.ts(3,1): error TS2322: Type 'string' is not assignable to type 'number'.

התיקון הוא להמיר את הערך, port = Number("3000"), או לשנות את הערת הטיפוס אם המשתנה באמת אמור להחזיק טקסט.

number: אין טיפוס של מספר שלם

JavaScript שומרת כל מספר כערך נקודה צפה של 64 ביט, ולכן ל-TypeScript יש טיפוס number אחד. מספרים שלמים מדויקים עד Number.MAX_SAFE_INTEGER (2 ** 53 - 1). מעבר לזה, השתמשו ב-bigint.

bigint ו-number לא מתערבבים: exact + 1 היא שגיאת קומפילציה (TS2365: Operator '+' cannot be applied to types 'bigint' and '1'., כש-'1' הוא טיפוס הליטרל של ה-1), ואם היא הייתה רצה, גם TypeError בזמן ריצה. המירו צד אחד במפורש עם BigInt(1) או Number(exact), בידיעה ש-Number מעגל ערכים שמעבר לטווח הבטוח.

אם אתם רוצים טיפוס שמקבל רק מספרים שלמים, TypeScript לא יכולה לבטא את זה לערכים שרירותיים. בצעו ולידציה עם Number.isInteger במקום שבו הערך נכנס לתוכנית.

boolean

ל-boolean יש בדיוק שני ערכים, true ו-false. ערכים שהם רק truthy (1, "yes") הם לא בוליאניים, ולכן הפכו אותם לבוליאני עם Boolean(x) או x !== 0.

null ו-undefined

כש-strict פעיל (ברירת המחדל מאז TypeScript 6.0), null ו-undefined הם טיפוסים נפרדים ואינם חלק מ-string, number או מכל טיפוס אחר. משתנה שעשוי להיות ריק אומר את זה עם union:

קריאת מאפיין של ערך שעשוי להיות undefined היא שגיאת קומפילציה עד שבודקים אותו. העמוד null ו-undefined מכסה את הבדיקות, את ?. ואת ??.

מבט מהיר על מערכים ואובייקטים

כל מה שאינו פרימיטיבי הוא טיפוס אובייקט. שלוש הצורות שפוגשים ראשונות:

let tags: string[] = ["ts", "js"];               // array of strings
let point: { x: number; y: number } = { x: 1, y: 2 }; // object with two number properties
let greet: (name: string) => string = (n) => `hi ${n}`; // function type

לכל אחת יש עמוד משלה: מערכים, tuples (מערכים באורך קבוע), טיפוסי אובייקט וטיפוסי פונקציה.

string, number, boolean מול String, Number, Boolean

השמות באות גדולה הם הטיפוסים של אובייקטי העטיפה של JavaScript (new String("x")), ולא של ערכים רגילים. כתבו הערות טיפוס עם השמות באותיות קטנות.

index.ts(3,7): error TS2322: Type 'String' is not assignable to type 'string'.
  'string' is a primitive, but 'String' is a wrapper object. Prefer using 'string' when possible.

שנו את String ל-string בשורה הראשונה והבלוק ירוץ. אותו דבר חל על Number, Boolean, Symbol ו-BigInt. (Object הוא מקרה אחר: הוא מקבל כמעט כל ערך, כולל פרימיטיביים; ראו טיפוסי אובייקט.)

טיפוסים מובנים נוספים

עוד כמה טיפוסים מופיעים מוקדם. לכל אחד יש עמוד משלו.

טיפוסמשמעות
anyמכבה את הבדיקה עבור הערך. הימנעו ממנו.
unknownכל ערך, אבל חייבים לבדוק אותו לפני שמשתמשים בו.
voidפונקציה לא מחזירה שום דבר שימושי.
neverאין ערך בכלל: פונקציה שתמיד זורקת, או מקרה בלתי אפשרי.
objectכל ערך שאינו פרימיטיבי.
"red" | "green"טיפוס ליטרל: רק הערכים המדויקים האלה.

שאלות נפוצות

האם יש ב-TypeScript טיפוס של מספר שלם?

לא. number מכסה גם מספרים שלמים וגם שברים, כי JavaScript שומרת כל מספר כ-float של 64 ביט. בדקו מספר שלם בזמן ריצה עם Number.isInteger(n), והשתמשו ב-bigint (10n) כשצריך מספרים שלמים גדולים מ-Number.MAX_SAFE_INTEGER (2 ** 53 - 1) בלי לאבד דיוק.

מה ההבדל בין string ל-String ב-TypeScript?

string הוא הטיפוס הפרימיטיבי, והוא הטיפוס של ליטרלים של מחרוזות ושל template strings. String הוא הטיפוס של אובייקט העטיפה שנוצר עם new String("x"). תמיד כתבו הערות טיפוס באותיות קטנות, string, number ו-boolean; השמה של String ל-string היא שגיאת קומפילציה (TS2322).

מהם הטיפוסים הפרימיטיביים ב-TypeScript?

אותם שבעה כמו ב-JavaScript: string, number, boolean, bigint, symbol, null ו-undefined. כל השאר (מערכים, אובייקטים, פונקציות, מופעים של מחלקות) הם טיפוסי אובייקט.

איך מצהירים על משתנה עם טיפוס ב-TypeScript?

שמים נקודתיים והטיפוס אחרי השם: let count: number = 0;. בפונקציה, תנו הערת טיפוס לכל פרמטר, ואם רוצים גם לטיפוס ההחזרה: function add(a: number, b: number): number. כשמשתנה מאותחל, בדרך כלל אפשר להשמיט את הערת הטיפוס ולתת ל-TypeScript להסיק אותו.

האם הטיפוסים של TypeScript קיימים בזמן ריצה?

לא. הקומפיילר בודק את הטיפוסים ואז מסיר אותם, כך של-JavaScript שרץ אין הערות טיפוס. בזמן ריצה בודקים ערכים עם אופרטורים של JavaScript כמו typeof, Array.isArray ו-instanceof.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל