מחרוזת ב-TypeScript היא מחרוזת JavaScript עם הטיפוס string. לאינטרפולציה, כתבו template literal: backticks עם מצייני מקום ${expression}. מירכאות בודדות וכפולות יוצרות מחרוזות רגילות בלי אינטרפולציה.
שלושת סוגי המירכאות מייצרים את אותו טיפוס, string. ה-$ הראשון ב-$${...} הוא סימן דולר רגיל; רק ${ פותח מציין מקום.
String interpolation
בתוך ${ } אפשר לשים משתנה, חישוב, קריאה לפונקציה, אופרטור טרנרי או template literal מקונן. הערך מומר למחרוזת באותה דרך ש-String(value) היה ממיר אותו (symbol הוא החריג: אינטרפולציה שלו היא שגיאת הקומפילציה TS2731, ובזמן ריצה היא הייתה זורקת TypeError; כתבו String(sym)).
אינטרפולציה של אובייקט מדפיסה [object Object], וזה כמעט אף פעם לא מה שאתם רוצים. בחרו את השדות, או השתמשו ב-JSON.stringify(obj).
מחרוזות מרובות שורות
template literal יכול להשתרע על כמה שורות. מעברי השורה נשמרים, וכך גם כל הזחה בתחילת כל שורה, כי כל מה שבין ה-backticks הוא חלק מהמחרוזת.
כשההזחה של הקוד שלכם עלולה לדלוף לתוך המחרוזת, בנו אותה עם מערך ו-join("\n"), או הצמידו את השורות של ה-template literal לתחילת השורה.
בדיקה אם מחרוזת מכילה תת-מחרוזת
includes עונה על השאלה "האם היא מכילה" עם boolean. startsWith ו-endsWith בודקים את הקצוות. indexOf נותן את המיקום, או -1 כשתת-המחרוזת לא קיימת. כולם רגישים לאותיות גדולות וקטנות.
includes מקבל גם מיקום התחלה: file.includes("R", 1) מחפש רק מאינדקס 1.
מתודות נפוצות והטיפוסים שלהן
TypeScript מכיר את טיפוס ההחזרה של כל מתודה מובנית. כדאי לשים לב במיוחד לאלה שיכולות לחזור ריקות, כי תחת strict חייבים לטפל ב-null או ב-undefined לפני שמשתמשים בתוצאה.
| מתודה | מחזירה | דוגמה |
|---|---|---|
includes, startsWith, endsWith | boolean | "abc".includes("b") הוא true |
indexOf, lastIndexOf | number (-1 אם לא נמצא) | "abc".indexOf("c") הוא 2 |
slice, substring | string | "hello".slice(1, 3) הוא "el" |
split | string[] | "a,b".split(",") הוא ["a", "b"] |
trim, trimStart, trimEnd | string | " x ".trim() הוא "x" |
toUpperCase, toLowerCase | string | "Ts".toUpperCase() הוא "TS" |
padStart, padEnd | string | "7".padStart(3, "0") הוא "007" |
replace, replaceAll | string | "a-b-c".replaceAll("-", "") הוא "abc" |
repeat | string | "ab".repeat(2) הוא "abab" |
at | string | undefined | "abc".at(-1) הוא "c" |
match | RegExpMatchArray | null | "a1".match(/\d/) |
length (מאפיין) | number | "abc".length הוא 3 |
גישה רגילה לפי אינדקס, s[5], היא מטיפוס string גם כשהאינדקס מעבר לסוף (ושם הערך בזמן ריצה הוא undefined). אפשרות הקומפיילר noUncheckedIndexedAccess הופכת אותו ל-string | undefined.
מחרוזות הן immutable
אי אפשר לשנות תו במקום. TypeScript מדווח על השמה לאינדקס כשגיאה TS2542, Index signature in type 'String' only permits reading., וב-JavaScript של strict mode שהקוד מתקמפל אליו, אותה השמה הייתה זורקת TypeError בזמן ריצה. כל מתודה שנראה שהיא משנה מחרוזת מחזירה מחרוזת חדשה.
כדי להפוך ערכים אחרים למחרוזות, או מחרוזות למספרים, ראו string to number.
String literal types
string מקבל כל טקסט. string literal type מקבל ערך מדויק אחד, ואיחוד (union) של כמה כאלה יוצר קבוצה של מחרוזות מותרות, בדומה ל-enum:
ה-literal types נבדקים רק בזמן קומפילציה; בזמן ריצה label("deleted") עדיין ירוץ וידפיס Post is deleted, וזה מה שהשורה השנייה עושה כאן. התחביר של template literal עובד גם ברמת הטיפוסים, כמו ב-type EventName = `on${string}`, שמקבל כל מחרוזת שמתחילה ב-on.
שאלות נפוצות
איך עושים string interpolation ב-TypeScript?
השתמשו ב-template literal: גרשיים הפוכים (backticks) עם מצייני מקום ${expression}, כמו ב-`Hello, ${name}!`. כל ביטוי עובד בתוך הסוגריים המסולסלים, ולתוצאה יש טיפוס string. מירכאות בודדות וכפולות לא עושות אינטרפולציה.
איך כותבים מחרוזת מרובת שורות ב-TypeScript?
שימו את הטקסט בין backticks ושברו את השורות בקוד המקור: template literal שומר את מעברי השורה וגם את ההזחה שבתחילת כל שורה. אפשרות אחרת היא לחבר מערך של שורות עם .join("\n"), או להשתמש ב-\n בתוך מחרוזת רגילה.
איך בודקים ב-TypeScript אם מחרוזת מכילה תת-מחרוזת?
קראו ל-text.includes("part"), שמחזיר boolean. הוא רגיש לאותיות גדולות וקטנות, אז לבדיקה שלא רגישה לזה השוו מחרוזות באותיות קטנות: text.toLowerCase().includes(part.toLowerCase()). startsWith ו-endsWith בודקים את הקצוות, ו-indexOf מחזיר את המיקום או -1.
יש הבדל בין מחרוזות ב-TypeScript לבין מחרוזות ב-JavaScript?
לא, בזמן ריצה הן אותן מחרוזות JavaScript עם אותן מתודות. TypeScript מוסיף את הטיפוס string, בודק שאתם קוראים למתודות שקיימות, ויודע מה הן מחזירות, למשל ש-match יכול להחזיר null ו-at יכול להחזיר undefined.
אפשר לשנות תו במחרוזת ב-TypeScript?
לא. מחרוזות הן immutable, ו-s[0] = "H" היא שגיאת הקומפילציה TS2542 (Index signature in type 'String' only permits reading). במקום זה בנו מחרוזת חדשה: "H" + s.slice(1).