Соглашение об именах для тегированных функций шаблона - PullRequest
2 голосов
/ 12 марта 2019

тегированные функции шаблона не являются нормальными функциями, так же как функции конструктора не являются обычными функциями. Они никогда не должны вызываться отдельно от особым способом. Конструкторы, с new, тегирующими функциями с интерполированным строковым литералом.

У нас есть соглашение, что конструкторы должны быть в Pascal Case, поэтому для вызывающей стороны ясно, что это конструктор.

  1. Существует ли подобное соглашение для тегирования функций?
  2. Если нет, то будет ли соблюдение того, что у них есть заключительное подчеркивание, двусмысленным для любого другого соглашения?

function tagger_(s, name, food) {  
  return `${s[0]}${name}${s[1]}${food}${s[2]}`
}

const name = 'Dave';
const food = 'ice-cream'
const message = tagger_`Hello World!  My name is ${name} and I like ${food} for dinner`;

console.log(message);

Аргументом за то, что это не нормальная функция, является то, что первый аргумент не является строкой.

const log = console.log;

function tagger_(s) {
    console.log(`Has raw property: ${!!s.raw}`);
}

tagger_(`Hello World!`);
tagger_`Hello World!`

Аналогично, свойство s.raw содержит строку, не экранированную. Не было бы практического способа подделать это. Даже если бы можно было, это было бы очень плохой практикой.

function tagger_(s) {
    console.log(`s.raw: ${s.raw}`);
}

tagger_`This\nhas\tspecial characters`

Проблема с уткой

Несмотря на то, что может быть возможно создать объект типа утки для передачи в метод таким образом, чтобы он не потерпел неудачу немедленно, интерфейс генерируемого engune объекта может расширяться (например, может быть добавлено свойство escapedRaw) , Это будет означать, что любой вызов метода как нормальной функции прекратится.

Когда мы пишем, что нормальная функция полностью контролирует ее, это не так, потому что тип параметра s не контролируется автором, если функция.

...