Una guía para los literales de plantillas de JavaScript

Introducido en ES2015, también conocido como ES6, Template Literals ofrece una nueva forma de declarar cadenas, pero también algunas construcciones nuevas e interesantes que ya son muy populares.

Introducción a los literales de plantilla

Los literales de plantilla son una nueva característica de ES2015 / ES6 que le permite trabajar con cadenas de una manera novedosa en comparación con ES5 y versiones anteriores.

La sintaxis a primera vista es muy simple, solo use comillas inversas en lugar de comillas simples o dobles:

const a_string = `something`

Son únicos porque proporcionan muchas características que las cadenas normales construidas con comillas no ofrecen, en particular:

  • ofrecen una gran sintaxis para definir cadenas de varias líneas
  • proporcionan una forma sencilla de interpolar variables y expresiones en cadenas
  • le permiten crear DSL con etiquetas de plantilla (DSL significa lenguaje específico de dominio, y se usa, por ejemplo, en React by Styled Components, para definir CSS para un componente)

Analicemos cada uno de estos en detalle.

Cuerdas multilínea

Pre-ES6, para crear una cadena que abarque dos líneas, tenía que usar el\carácter al final de una línea:

const string =
  'first part \
second part'

Esto permite crear una cadena en 2 líneas, pero se representa en una sola línea:

first part second part

Para representar la cadena en varias líneas también, debe agregar explícitamente\nal final de cada línea, así:

const string =
  'first line\n \
second line'

o

const string = 'first line\n' + 'second line'

Los literales de plantilla hacen que las cadenas de varias líneas sean mucho más simples.

Una vez que se abre una plantilla literal con la comilla invertida, solo presiona enter para crear una nueva línea, sin caracteres especiales, y se representa como está:

const string = `Hey
this

string
is awesome!`

Tenga en cuenta que el espacio es significativo, así que haga esto:

const string = `First
                Second`

va a crear una cadena como esta:

First
                Second

an easy way to fix this problem is by having an empty first line, and appending the trim() method right after the closing backtick, which will eliminate any space before the first character:

const string = `
First
Second`.trim()

Interpolation

Template literals provide an easy way to interpolate variables and expressions into strings.

You do so by using the ${...} syntax:

const myVariable = 'test'
const string = `something ${myVariable}` //something test

inside the ${} you can add anything, even expressions:

const string = `something ${1 + 2 + 3}`
const string2 = `something ${doSomething() ? 'x' : 'y'}`

Template tags

Tagged templates is one feature that might sound less useful at first for you, but it’s actually used by lots of popular libraries around, like Styled Components or Apollo, the GraphQL client/server lib, so it’s essential to understand how it works.

In Styled Components template tags are used to define CSS strings:

const Button = styled.button`
  font-size: 1.5em;
  background-color: black;
  color: white;
`

In Apollo template tags are used to define a GraphQL query schema:

const query = gql`
  query {
    ...
  }
`

The styled.button and gql template tags highlighted in those examples are just functions:

function gql(literals, ...expressions) {}

this function returns a string, which can be the result of any kind of computation.

literals is an array containing the template literal content tokenized by the expressions interpolations.

expressions contains all the interpolations.

If we take an example above:

const string = `something ${1 + 2 + 3}`

literals is an array with two items. The first is something, the string until the first interpolation, and the second is an empty string, the space between the end of the first interpolation (we only have one) and the end of the string.

expressions in this case is an array with a single item, 6.

A more complex example is:

const string = `something
another ${'x'}
new line ${1 + 2 + 3}
test`

in this case literals is an array where the first item is:

;`something
another `

the second is:

;`
new line `

and the third is:

;`
test`

expressions in this case is an array with two items, x and 6.

The function that is passed those values can do anything with them, and this is the power of this kind feature.

The most simple example is replicating what the string interpolation does, by joining literals and expressions:

const interpolated = interpolate`I paid ${10}€`

and this is how interpolate works:

function interpolate(literals, ...expressions) {
  let string = ``
  for (const [i, val] of expressions.entries()) {
    string += literals[i] + val
  }
  string += literals[literals.length - 1]
  return string
}

More js tutorials: