Тег для универсальной литеральной функции шаблона в javascript

Моя цель - написать помеченную функцию шаблона, например

myTemplateTagFunction`some text ${variable} etc. etc.`

... которая ведет себя как литеральная функция шаблона по умолчанию в javascript.

Моя первая попытка была

let myTaggedTemplate = args => `${args}`

Но это быстро ломается...

> myTaggedTemplate`hello world ${2 + 5}`
// "hello world ,"

> `hello world ${2 + 5}`
// "hello world 7"

Должен быть более простой способ сделать это, что мне не хватает?


person rob-gordon    schedule 10.10.2020    source источник
comment
Говоря о функции литерала шаблона по умолчанию, вы имеете в виду, как литерал шаблона будет вести себя без тега?   -  person Emiel Zuurbier    schedule 11.10.2020
comment
Шаблоны с тегами так не работают. Вы смотрели документацию (например) MDN, чтобы увидеть, что аргументы фактически передаются тегированной функции шаблона?   -  person Quentin    schedule 11.10.2020
comment
@Quentin Я просмотрел документацию, поэтому моей первой попыткой было передать входящие аргументы обратно в литеральную функцию шаблона. Если вы действительно хорошо их понимаете, пожалуйста, проявите свое понимание к ответу на этот вопрос.   -  person rob-gordon    schedule 11.10.2020
comment
@rob-gordon — Предпосылка вопроса на самом деле не имеет смысла. Я могу придумать решение (такое же, как у Питера, бывает), но оно, честно говоря, глупое. Просто используйте литерал шаблона, если хотите такой эффект.   -  person Quentin    schedule 11.10.2020
comment
@Quentin Если вы хотите знать, почему я спрашиваю, спросите, почему я спрашиваю. Если вы хотите высмеивать вопрос, а не допрашивать, то это на вас   -  person rob-gordon    schedule 11.10.2020


Ответы (3)


Возможно, есть более короткий способ сделать это, но это мой подход:

const myTaggedTemplate = (strings, ...vars) => {
    let result = '';
    strings.forEach((str, i) => {
        result += `${str}${i === strings.length - 1 ? '' : vars[i]}`;
    });
    return result;
};
person domenikk    schedule 10.10.2020
comment
Что с этим === undefined чеком? Это не то, как работают обычные строки шаблона. - person Bergi; 11.10.2020
comment
Массив строк может быть длиннее, чем массив vars, поэтому для последнего индекса vars[i] будет неопределенным. - person domenikk; 11.10.2020
comment
Спасибо за редактирование, так лучше. - person Bergi; 11.10.2020

Как определить помеченную функцию шаблона

Если вы определяете теговую функцию шаблона, она должна получить массив строк в качестве первого аргумента и выражения произвольного числа в качестве последующих параметров. Все строки представляют собой строки между вставленными вами выражениями (между всеми ${...}), а все выражения являются значениями того, что вы поместили в ${...}.

Пример кода

let numExp = 2;

function tagFunction(strings, ...expressions) {
  let returnString = "";
  for (let i = 0; i < expressions.length; i++) {
    returnString += strings[i] + expressions[i];
  }
  returnString += strings[strings.length - 1];
  return returnString;
}

console.log(
  tagFunction`Using function \"${tagFunction.name}\" with ${numExp} expressions`
);

person Peter Lehnhardt    schedule 10.10.2020

Вам нужно изменить свою функцию:

let myTaggedTemplate = (strings,...values) => ...;

и попробуйте следовать примеру в этой ссылке

person ZORGATI Achraf    schedule 10.10.2020