处理模板字面量的本地函数名称是什么?
也就是说,当您编写tag`Foo ${'bar'}.`;
时,那只是tag(['Foo ','。'],'bar')
的语法糖¹。
但是对于`Foo ${'bar'}.`;
而言呢?我不能只“调用”(['Foo ','。'],'bar')
。如果我已经有了这种形式的参数,应该把它们传递给哪个函数?
我只对实现模板字面量功能的本地函数感兴趣。我完全有能力自己编写,但是这个问题的目的是避免这样做并按照“正确”的方式进行操作,即使我的实现与当前本地功能完全匹配,本地功能也可能会更改,我希望我的用法仍然匹配。因此,对这个问题的答案应采取以下形式之一:
使用的本地函数名称,最好附带文档链接和/或引用。
定义了该函数实现的规范的链接和/或引用,以便我自己编写时至少可以确保符合(当前的)规范。
备份的声明,即本地实现不可用且未指定。理想情况下,这是通过文档的链接和/或引用进行支持的,但如果不可用,我将接受其他支持该声明的来源或论证。
- 实际上,第一个参数需要一个
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