Соглашение об именах для тегированных функций шаблона
Функции шаблона с тегами не являются обычными функциями, так же как функции-конструкторы не являются обычными функциями. Они никогда не должны называться по- особенному. Конструкторы, с new
, тегирование функций с помощью интерполированного строкового литерала.
У нас есть соглашение, что конструкторы должны быть в Pascal Case, поэтому для вызывающей стороны ясно, что это конструктор.
- Существует ли подобное соглашение для функций тегирования?
- Если нет, то будет ли соблюдение того, что у них есть заключительное подчеркивание, быть двусмысленным для любого другого соглашения?
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
Свойство содержит строку unescaped. Не было бы никакого практического способа подделать это. Даже если бы можно было, это было бы очень плохой практикой.
function tagger_(s) {
console.log(`s.raw: ${s.raw}`);
}
tagger_`This\nhas\tspecial characters`
Утиная проблема печати
Хотя может быть возможно создать объект типа утки для передачи в метод, чтобы он сразу не потерпел неудачу, интерфейс генерируемого движком объекта может расширяться (например, может быть escapedRaw
свойство добавлено). Это будет означать, что любой вызов метода как нормальной функции прекратится.
Когда мы пишем обычную функцию, полностью контролируем ее, это не так, потому что s
Тип параметра не контролируется писателем, если функция.