Chuỗi (string) trong TypeScript là một chuỗi JavaScript mang kiểu string. Để nội suy, hãy viết một template literal: dấu backtick với các placeholder ${expression}. Dấu nháy đơn và nháy kép tạo ra chuỗi thường, không có nội suy.
Cả ba kiểu dấu nháy đều cho ra cùng một kiểu, string. Dấu $ đầu tiên trong $${...} là ký tự đô la bình thường; chỉ ${ mới mở đầu một placeholder.
Nội suy chuỗi
Bên trong ${ } bạn có thể đặt một biến, một phép tính, một lời gọi hàm, một toán tử ba ngôi hay một template literal lồng nhau. Giá trị được chuyển thành chuỗi giống như cách String(value) chuyển đổi (ngoại lệ là symbol: nội suy một symbol là lỗi biên dịch TS2731, và lúc chạy sẽ ném ra TypeError; hãy viết String(sym)).
Nội suy một đối tượng sẽ in ra [object Object], gần như không bao giờ là thứ bạn muốn. Hãy chọn các trường cần thiết, hoặc dùng JSON.stringify(obj).
Chuỗi nhiều dòng
Một template literal có thể trải dài qua nhiều dòng. Các ký tự xuống dòng được giữ lại, và cả phần thụt lề ở đầu mỗi dòng cũng vậy, vì mọi thứ giữa hai dấu backtick đều thuộc về chuỗi.
Khi phần thụt lề của code có thể lọt vào chuỗi, hãy tạo chuỗi bằng một mảng và join("\n"), hoặc viết các dòng của template literal sát lề trái.
Kiểm tra một chuỗi có chứa chuỗi con không
includes trả lời câu hỏi "có chứa không" bằng một boolean. startsWith và endsWith kiểm tra hai đầu chuỗi. indexOf cho vị trí, hoặc -1 khi không có chuỗi con đó. Tất cả đều phân biệt chữ hoa chữ thường.
includes cũng nhận vị trí bắt đầu: file.includes("R", 1) chỉ tìm từ chỉ số 1 trở đi.
Các phương thức thường dùng và kiểu của chúng
TypeScript biết kiểu trả về của mọi phương thức có sẵn. Cần chú ý những phương thức có thể trả về rỗng, vì khi bật strict bạn phải xử lý null hoặc undefined trước khi dùng kết quả.
| Phương thức | Trả về | Ví dụ |
|---|---|---|
includes, startsWith, endsWith | boolean | "abc".includes("b") là true |
indexOf, lastIndexOf | number (-1 nếu không có) | "abc".indexOf("c") là 2 |
slice, substring | string | "hello".slice(1, 3) là "el" |
split | string[] | "a,b".split(",") là ["a", "b"] |
trim, trimStart, trimEnd | string | " x ".trim() là "x" |
toUpperCase, toLowerCase | string | "Ts".toUpperCase() là "TS" |
padStart, padEnd | string | "7".padStart(3, "0") là "007" |
replace, replaceAll | string | "a-b-c".replaceAll("-", "") là "abc" |
repeat | string | "ab".repeat(2) là "abab" |
at | string | undefined | "abc".at(-1) là "c" |
match | RegExpMatchArray | null | "a1".match(/\d/) |
length (thuộc tính) | number | "abc".length là 3 |
Truy cập chỉ số thông thường, s[5], có kiểu string ngay cả khi chỉ số vượt quá cuối chuỗi (lúc chạy giá trị khi đó là undefined). Tùy chọn trình biên dịch noUncheckedIndexedAccess sẽ đổi nó thành string | undefined.
Chuỗi là bất biến
Bạn không thể thay đổi một ký tự tại chỗ. TypeScript báo phép gán vào một chỉ số là lỗi TS2542, Index signature in type 'String' only permits reading., và trong JavaScript ở strict mode mà nó được biên dịch ra, cùng phép gán đó sẽ ném ra TypeError lúc chạy. Mọi phương thức trông như sửa chuỗi thật ra đều trả về một chuỗi mới.
Để chuyển các giá trị khác thành chuỗi, hoặc chuỗi thành số, xem chuyển string sang number.
String literal type
string chấp nhận văn bản bất kỳ. Một string literal type chỉ chấp nhận đúng một giá trị, và union của chúng tạo ra một tập chuỗi được phép, giống như enum:
Literal type chỉ được kiểm tra lúc biên dịch; lúc chạy label("deleted") vẫn chạy và in ra Post is deleted, đúng như dòng thứ hai ở đây. Cú pháp template literal cũng dùng được ở cấp kiểu, như type EventName = `on${string}`, kiểu này chấp nhận mọi chuỗi bắt đầu bằng on.
Câu hỏi thường gặp
Nội suy chuỗi trong TypeScript như thế nào?
Dùng template literal: dấu backtick với các placeholder ${expression}, như `Hello, ${name}!`. Mọi biểu thức đều đặt được trong cặp ngoặc nhọn, và kết quả có kiểu string. Dấu nháy đơn và nháy kép không nội suy.
Làm sao viết chuỗi nhiều dòng trong TypeScript?
Đặt văn bản trong dấu backtick và xuống dòng ngay trong mã nguồn: template literal giữ lại các ký tự xuống dòng và cả phần thụt lề ở đầu mỗi dòng. Cách khác là nối một mảng các dòng bằng .join("\n"), hoặc dùng \n trong một chuỗi thông thường.
Làm sao kiểm tra một chuỗi có chứa chuỗi con trong TypeScript?
Gọi text.includes("part"), phương thức này trả về một boolean. Nó phân biệt chữ hoa chữ thường, nên để so sánh không phân biệt, hãy chuyển cả hai về chữ thường: text.toLowerCase().includes(part.toLowerCase()). startsWith và endsWith kiểm tra hai đầu chuỗi, còn indexOf trả về vị trí hoặc -1.
Chuỗi trong TypeScript và JavaScript có khác nhau không?
Không, lúc chạy chúng là cùng một kiểu chuỗi JavaScript với cùng các phương thức. TypeScript thêm kiểu string, kiểm tra rằng bạn gọi những phương thức có tồn tại, và biết kiểu trả về, ví dụ match có thể trả về null còn at có thể trả về undefined.
Có thể thay đổi một ký tự trong chuỗi TypeScript không?
Không. Chuỗi là bất biến, và s[0] = "H" là lỗi biên dịch TS2542 (Index signature in type 'String' only permits reading). Thay vào đó, hãy tạo một chuỗi mới: "H" + s.slice(1).