模板字面量的默认“标签”函数是什么?

5

处理模板字面量的本地函数名称是什么?

也就是说,当您编写tag`Foo ${'bar'}.`;时,那只是tag(['Foo ','。'],'bar')的语法糖¹。

但是对于`Foo ${'bar'}.`;而言呢?我不能只“调用”(['Foo ','。'],'bar')。如果我已经有了这种形式的参数,应该把它们传递给哪个函数?

我只对实现模板字面量功能的本地函数感兴趣。我完全有能力自己编写,但是这个问题的目的是避免这样做并按照“正确”的方式进行操作,即使我的实现与当前本地功能完全匹配,本地功能也可能会更改,我希望我的用法仍然匹配。因此,对这个问题的答案应采取以下形式之一:

  1. 使用的本地函数名称,最好附带文档链接和/或引用。

  2. 定义了该函数实现的规范的链接和/或引用,以便我自己编写时至少可以确保符合(当前的)规范。

  3. 备份的声明,即本地实现不可用且未指定。理想情况下,这是通过文档的链接和/或引用进行支持的,但如果不可用,我将接受其他支持该声明的来源或论证。


  1. 实际上,第一个参数需要一个raw属性,因为它是TemplateStringsArray而不是常规数组,但是出于使示例更易读的目的,在此跳过它。

动机

我正在尝试创建一个标记函数(称为tag),该函数在内部对输入执行默认的模板字面量串联。也就是说,我正在将TemplateStringsArray和剩余参数组合成一个已经处理好其模板化的单个字符串。(这是为了将结果传递到另一个标记函数中,例如otherTag ,其中我希望第二个函数将所有内容视为单个字符串文字而不是分解的模板。)

例如,tag`Something ${'cooked'}.`;等价于otherTag`Something cooked.`;

我的当前方法

tag 的定义看起来像这样:

function tag(textParts, ...expressions) {
  const cooked = // an array with a single string value
  const raw = // an array with a single string value
  return otherTag({ ...cooked, raw });
}

定义raw的值相当简单:我知道我需要调用String.raw标记函数,因此const raw = [String.raw(textParts.raw, ...expressions)];

但是我无法在互联网上找到任何有关于cooked部分应该调用哪个函数的信息。我的意思是,如果我有tag`Something ${'cooked'}.`;,我希望在我的函数中使用const cooked = `Something ${cooked}.`;。但是我找不到实现它的任何函数名称。

我找到的最接近的是一个说法,即可以通过以下方式来实现

const cooked = [expressions.map((exp, i) => textParts[i] + exp).join('')];

这是错误的——textParts可能比expressions更长,因为tag`Something ${'cooked'}.`;的参数分别为['Something ', '.']['cooked']
改进此表达式以处理这种情况并不是问题:

const cooked = [
  textParts
    .map((text, i) => (i > 0 ? expressions[i-1] : '') + text)
    .join(''),
];

但这不是重点 - 我不想自己编写并冒着与本机实现不一致的风险,特别是如果那会发生变化。


很遗憾,没有默认的。你必须自己制作。偶尔我会使用String.raw作为unindent = (...args) => String.raw(...args).replaceAll(/^\s+/g, "")的例子。当你只想处理模板并在之后自己进行后处理时,它适用于较小的东西,但它会转换一些符号。 - VLAZ
1个回答

0

使用的本地函数名称,最好附带链接和/或引用其文档。

没有这样一个函数。它是语法,不是一个函数。

链接到和/或引用定义此函数实现的规范,以便如果我自己编写,至少可以确保它符合(当前的)规范。

规范的第13.2.8模板文字部分解释了如何处理语法。


奇怪的事情是:如果我点击那个链接(在当前标签页中打开),它无法加载正确的页面。在新标签页中打开可以正常工作。无论如何,感谢您的答案(尽管我不喜欢那个答案)。 - KRyan
  1. 将标签应用于字符串模板是一种语法,但标签本身只是一个函数;内置的String.raw(…)的签名允许它作为一个标签使用。
  2. 对规范的引用并不是一个好的答案,否则几乎所有的SO问题都可以只用一个规范链接来回答。答案应该是对标准库中特定函数的引用(例如,一个MDN链接),或者是一个自定义函数的实现(假设可以存在这样一个函数)。
- undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接