Строка в TypeScript это строка JavaScript с типом string. Для интерполяции пишите шаблонный литерал: обратные кавычки с подстановками ${expression}. Одинарные и двойные кавычки создают обычные строки без интерполяции.
Все три вида кавычек дают один и тот же тип, string. Первый $ в $${...} это обычный знак доллара; подстановку начинает только ${.
Интерполяция строк
Внутри ${ } можно поставить переменную, арифметику, вызов функции, тернарный оператор или вложенный шаблонный литерал. Значение превращается в строку так же, как это сделал бы String(value) (исключение составляет symbol: его интерполяция даёт ошибку компиляции TS2731, а во время выполнения бросила бы TypeError; пишите String(sym)).
Интерполяция объекта печатает [object Object], а это почти никогда не то, что нужно. Выберите нужные поля или используйте JSON.stringify(obj).
Многострочные строки
Шаблонный литерал может занимать несколько строк. Переводы строк сохраняются, как и любые отступы в начале каждой строки, потому что всё между обратными кавычками входит в строку.
Если отступы кода просачиваются в строку, соберите её из массива через join("\n") или прижмите строки шаблонного литерала к началу строки.
Проверка вхождения подстроки
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.
Строки неизменяемы
Изменить символ на месте нельзя. TypeScript сообщает о присвоении по индексу как об ошибке TS2542, Index signature in type 'String' only permits reading., а в JavaScript в строгом режиме, в который код компилируется, такое присвоение бросило бы TypeError во время выполнения. Каждый метод, который вроде бы меняет строку, возвращает новую.
О том, как превращать другие значения в строки или строки в числа, читайте на странице строка в число.
Строковые литеральные типы
string принимает любой текст. Строковый литеральный тип принимает одно точное значение, а их объединение задаёт похожий на enum набор допустимых строк:
Литеральные типы проверяются только во время компиляции; во время выполнения label("deleted") всё равно выполнится и напечатает Post is deleted, что и делает здесь вторая строка. Синтаксис шаблонных литералов работает и на уровне типов, как в type EventName = `on${string}`: такой тип принимает любую строку, которая начинается с on.
Часто задаваемые вопросы
Как сделать интерполяцию строк в TypeScript?
Используйте шаблонный литерал: обратные кавычки с подстановками ${expression}, как в `Hello, ${name}!`. Внутри фигурных скобок работает любое выражение, а результат имеет тип string. Одинарные и двойные кавычки интерполяцию не поддерживают.
Как написать многострочную строку в TypeScript?
Заключите текст в обратные кавычки и переносите строки прямо в исходнике: шаблонный литерал сохраняет переводы строк, а также отступы в начале каждой строки. Другой вариант: соединить массив строк через .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?
Нет. Строки неизменяемы, и s[0] = "H" даёт ошибку компиляции TS2542 (Index signature in type 'String' only permits reading). Вместо этого соберите новую строку: "H" + s.slice(1).