为什么TypeScript传输的字符串串联从+运算符更改为string.concoat()调用



我试图在TypeScript文档中找到一个解释,解释为什么我的transpiled JavaScript现在使用String.contat((,而它过去使用加法运算符。我无法确定我的项目或工具链中发生了什么变化,从而导致了传输文件的差异。让我举一个我想描述的例子。

几个月前移植的TypeScript文件将移植此TypeScript:

`Order #${order.tranid} (IID ${order.id}) is ineligible for processing - exiting`

插入这个JavaScript:

"Order #" + order.tranid + " (IID " + order.id + ") is ineligible for processing - exiting"

现在,当我处理这个项目时,相同的TypeScript将生成:

"Order #".concat(order.tranid, " (IID ").concat(order.id, ") is ineligible for processing - exiting"

我的问题是:这里有人知道是什么导致了不同的输出吗?这是最近对编译器的更改吗?正如我在开头提到的,我在搜索中找不到任何解释它的东西

实现此更改是为了使传输的TypeScript模板字符串更符合本机模板文本的规范。

TypeScript第39744期和第43686期对此进行了跟踪。

该更改在TypeScript 4.4.2中公开发布(4.4.0和4.4.1分别为测试版和RC版(。

该线程中有一条相关的注释,指出之前的+字符串串联也会在即将到来的Temporal建议中引发错误。

使用Github问题中的示例:

class C {
toString() {
return "toString()";
}
valueOf() {
return "valueOf()";
}
}
const c = new C;
const s = `${c}`;
console.log(s);

JavaScript规范为模板文字定义的预期结果应该是toString()

但是,由于TypeScript正在向下转换以使用字符串串联运算符+,因此它将返回不正确的toValue()

通过更改为string.concat(),传输的TypeScript代码现在返回正确的toString()结果。

注意,只有当TypeScript向下传输到ES3或ES5时,这才是一个问题。

相关内容

最新更新