tl; dr: ¿Es posible hacer un literal de plantilla reutilizable?
He intentado usar plantillas literales, pero supongo que no lo entiendo y ahora me estoy frustrando. Quiero decir, creo que lo entiendo, pero "eso" no debería ser cómo funciona, o cómo debería ser. Debería ser diferente.
Todos los ejemplos que veo (incluso las plantillas etiquetadas) requieren que las "sustituciones" se realicen en tiempo de declaración y no en tiempo de ejecución, lo que me parece completamente inútil para una plantilla. Tal vez esté loco, pero una "plantilla" para mí es un documento que contiene tokens que se sustituyen cuando lo usas, no cuando lo creas, de lo contrario es solo un documento (es decir, una cadena). Una plantilla se almacena con los tokens como tokens y esos tokens se evalúan cuando ... la evalúas.
Todo el mundo cita un ejemplo horrible similar a:
var a = 'asd';
return `Worthless ${a}!`
Eso está bien, pero si ya lo sé a
, lo haría simplemente return 'Worthless asd'
o return 'Worthless '+a
. ¿Cuál es el punto de? Seriamente. Está bien, el punto es la pereza; menos ventajas, más legibilidad. Excelente. ¡Pero eso no es una plantilla! No en mi humilde opinión. ¡Y MHO es todo lo que importa! El problema, en mi humilde opinión, es que la plantilla se evalúa cuando se declara, así que, si lo hace, en mi humilde opinión:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Como expletive
no se declara, genera algo como My undefined template
. Súper. En realidad, al menos en Chrome, ni siquiera puedo declarar la plantilla; arroja un error porque expletive
no está definido. Lo que necesito es poder hacer la sustitución después de declarar la plantilla:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
Sin embargo, no veo cómo esto es posible, ya que estas no son realmente plantillas. Incluso cuando dices que debería usar etiquetas, no, no funcionan:
> explete = function(a,b) { console.log(a); console.log(b); }
< function (a,b) { console.log(a); console.log(b); }
> var tpl = explete`My ${expletive} template`
< VM2323:2 Uncaught ReferenceError: expletive is not defined...
Todo esto me ha llevado a creer que los literales de plantilla están horriblemente mal nombrados y deberían llamarse como realmente son: heredocs . ¿Supongo que la parte "literal" debería haberme alertado (como en, inmutable)?
¿Me estoy perdiendo de algo? ¿Existe una (buena) manera de hacer literal una plantilla reutilizable?
Te doy, plantillas literales reutilizables :
> function out(t) { console.log(eval(t)); }
var template = `\`This is
my \${expletive} reusable
template!\``;
out(template);
var expletive = 'curious';
out(template);
var expletive = 'AMAZING';
out(template);
< This is
my undefined reusable
template!
This is
my curious reusable
template!
This is
my AMAZING reusable
template!
Y aquí hay una función de "ayuda" ingenua ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
...para hacerlo mejor".
Me inclino a llamarlos guías de plantilla por el área desde la que producen sensaciones retorcidas.
<strike>
etiqueta.