我试图在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时,这才是一个问题。