With something as simple as ${str}
you can use a simple string replacement:
var template = (tpl, args) => tpl.replace(/\${(\w+)}/g, (_, v) => args[v]);
var tpl="Hello ${str} and ${other}";
console.log(template(tpl, {str: 'foo', other: 'bar'}));
In a general case, no, not possible without eval (short of writing your own js interpreter), because ${...}
can contain arbitrary expressions.
For completeness’ sake, here’s the eval solution:
var template = function(tpl, args) {
var keys = Object.keys(args),
fn = new Function(...keys,
'return `' + tpl.replace(/`/g, '\\`') + '`');
return fn(...keys.map(x => args[x]));
};
function test() {
var myTpl="Hello ${str + "!"} and ${other.toUpperCase()}";
console.log(template(myTpl, {str: 'foo', other: 'bar'}));
}
test();