Строкові шаблони (шаблонні літерали).
Синтаксично це рядки, які використовують зворотні галочки (тобто ` ) замість одинарних (') або подвійних (") лапок. Бонусом шаблонних літералів є:
- Інтерполяція строк
- Багаторядкові строки
- Шаблони з тегами
Інтерполяція строк.
Ще один поширений випадок використання — це коли ви хочете створити деякий рядок із кількох статичних рядків + деяких змінних. Для цього вам знадобиться деяка логіка шаблонів, і саме звідси строкові шаблонні отримали свою назву. Відтоді їх було офіційно перейменовано на літерали шаблону. Ось як раніше можна було створити рядок html:
var lyrics = 'Never gonna give you up';
var html = '<div>' + lyrics + '</div>';
Зараз ви можете використати легший варіант:
var lyrics = 'Never gonna give you up';
var html = `<div>${lyrics}</div>`;
Зауважте, що будь-який заповнювач усередині інтерполяції (${
і }
) розглядається як вираз JavaScript і оцінюється як такий, наприклад. ви можете займатися дивовижною математикою.
console.log(`1 and 1 make ${1 + 1}`);
Багаторядкові строки.
EВи хотіли поставити новий рядок у рядок JavaScript? Можливо, ви хотіли вставити текст? Вам потрібно було б екранувати символ нового рядка за допомогою нашого улюбленого символу екранування \
, а потім вручну вставити новий рядок у рядок \n
у наступному рядку. Це показано нижче:
var lyrics = "Never gonna give you up \
\nNever gonna let you down";
В TypeScript можна просто використати template string:
var lyrics = `Never gonna give you up
Never gonna let you down`;
Шаблони з тегами.
Ви можете розмістити функцію (так званий «тег») перед рядком шаблону, і вона отримає можливість попередньо обробити літерали рядка шаблону плюс значення всіх виразів-заповнювачів і повернути результат. Кілька зауважень:
- Усі статичні літерали передаються як масив для першого аргументу.
- Усі значення виразів-заповнювачів передаються як інші аргументи. Найчастіше ви просто використовуєте параметри rest, щоб також перетворити їх у масив.
Ось приклад, у якому ми маємо функцію тегу (під назвою htmlEscape
), яка екранує html з усіх заповнювачів:
var say = "a bird in hand > two in the bush";
var html = htmlEscape `<div> I would just like to say : ${say}</div>`;
// a sample tag function
function htmlEscape(literals: TemplateStringsArray, ...placeholders: string[]) {
let result = "";
// interleave the literals with the placeholders
for (let i = 0; i < placeholders.length; i++) {
result += literals[i];
result += placeholders[i]
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
// add the last literal
result += literals[literals.length - 1];
return result;
}
Примітка. Ви можете позначити
заповнювачі
як будь-який[]
. Що б ви не анотували, TypeScript введе перевірку, щоб переконатися, що заповнювачі, які використовуються для виклику тегу, відповідають анотації. Наприклад, якщо ви плануєте мати справу зрядком
абочислом
, ви можете анотувати...placeholders:(string | number)[]
Згенерований JS.
Для цілей компіляції до ES6 код досить простий. Багаторядкові рядки стають екранованими. Інтерполяція рядків стає конкатенацією рядків. Шаблони з тегами стають викликами функцій.
Багаторядкові рядки та інтерполяція рядків — це просто чудові речі в будь-якій мові. Чудово, що тепер ви можете використовувати їх у своєму JavaScript (дякуючи TypeScript!). Шаблони з тегами дозволяють створювати потужні рядкові утиліти.