Как я могу создать строку шаблона из обычной строки?

Итак, у меня есть это string:

var name = "Chaim";
var templateStr = "Hello, my name is ${name}";

Как я могу преобразовать его в строку-шаблон, чтобы результат был равен:

var template = `Hello, my name is ${name}`;

Есть ли способ программно построить литерал шаблона?


person haim770    schedule 21.04.2015    source источник
comment
Вы не можете без eval, и я не думаю, что вы этого хотите. Почему бы просто не использовать строку шаблона в первую очередь?   -  person Bergi    schedule 21.04.2015
comment
Потому что я хочу передать динамическую строку для использования в качестве шаблона.   -  person haim770    schedule 21.04.2015
comment
@ haim770 Почему динамическая строка не может быть литералом шаблона?   -  person thefourtheye    schedule 21.04.2015
comment
Потому что он возвращается с сервера как часть ответа Http.   -  person haim770    schedule 21.04.2015
comment
@Bergi, по-видимому, строки шаблона уже неявно eval. Например: `hi ${alert()}`   -  person haim770    schedule 21.04.2015
comment
@ haim770: Да, это так, и это проблема. Откуда берутся ваши динамические строки?   -  person Bergi    schedule 21.04.2015
comment
@Bergi, как я уже упоминал, они возвращаются с сервера (запрос Ajax).   -  person haim770    schedule 21.04.2015
comment
@ haim770: Да, я имел в виду, откуда сервер берет строки, кто их вставляет? Созданы ли они пользователями? Жестко запрограммировано?   -  person Bergi    schedule 21.04.2015
comment
Они жестко закодированы в файле ресурсов, используемом для языковых переводов. Я понимаю риск безопасности, хотя. Я предполагаю, что мое намерение использовать этот механизм как систему шаблонов бедняка было неверным.   -  person haim770    schedule 21.04.2015
comment
Это дубликат stackoverflow.com/q/29182244/218196, но ответ @Bergi лучше;)   -  person Felix Kling    schedule 21.04.2015
comment
@FelixKling: Это все еще имхо. И Джейсон Орендорффс отвечает, что это гвоздь.   -  person Bergi    schedule 21.04.2015
comment
@ Берги: Да. Может быть, вы также можете опубликовать свой ответ там. Или не надо. Мне просто понравился твой ответ :)   -  person Felix Kling    schedule 21.04.2015


Ответы (1)


Есть ли способ программно построить литерал шаблона?

Нет. «программно» и «буквально» противоположны (за исключением того, что вы находитесь в сфере компиляторов).

Шаблонные строки лучше было бы назвать интерполированными строковыми литералами или около того. Пожалуйста, не путайте их с шаблонами. Если вы хотите использовать динамически создаваемые строки для шаблонов, используйте механизм шаблонов по вашему выбору.

Конечно, шаблонные литералы могут помочь с реализацией таких вещей, и вам может сойти с рук что-то простое, например

function assemble(literal, params) {
    return new Function(params, "return `"+literal+"`;"); // TODO: Proper escaping
//             ^^^^^^^^ working in real ES6 environments only, of course
}
var template = assemble("Hello, my name is ${name}", "name");
template("Chaim"); // Hello, my name is Chaim
person Bergi    schedule 21.04.2015
comment
Template strings should better have been named interpolated string literals - Разве они не называются квази-литералами? - person thefourtheye; 28.04.2015
comment
Ключевым здесь является программно ≠ литерал. - person Christophe Marois; 18.03.2016
comment
Это опасно, так как в основном eval()s строка. - person ADJenks; 28.03.2019
comment
@adjenks Да, вам нужно убедиться, что literal является допустимым и безопасным значением. Это опасно только тогда, когда вы не контролируете значение. - person Bergi; 28.03.2019