Menu

Строки в TypeScript: интерполяция, многострочность, includes

Работа со строками в TypeScript: интерполяция через шаблонные литералы, многострочные строки, проверка вхождения подстроки, основные методы и типы, которые они возвращают, и строковые литеральные типы.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Строка в 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, endsWithboolean"abc".includes("b") равно true
indexOf, lastIndexOfnumber (-1, если нет)"abc".indexOf("c") равно 2
slice, substringstring"hello".slice(1, 3) равно "el"
splitstring[]"a,b".split(",") равно ["a", "b"]
trim, trimStart, trimEndstring" x ".trim() равно "x"
toUpperCase, toLowerCasestring"Ts".toUpperCase() равно "TS"
padStart, padEndstring"7".padStart(3, "0") равно "007"
replace, replaceAllstring"a-b-c".replaceAll("-", "") равно "abc"
repeatstring"ab".repeat(2) равно "abab"
atstring | undefined"abc".at(-1) равно "c"
matchRegExpMatchArray | 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).

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ