【问题标题】:It is possible to interpolate Typescript where the variable is a string?可以在变量是字符串的地方插入 Typescript?
【发布时间】:2017-07-05 12:43:52
【问题描述】:

我需要插入一个字符串变量,但这不起作用。 有没有办法插入这个变量?直接做替换更好吗?

例如:

time = duration.years();
dateTime = this.i18nService.getTranslation('past-date-years');
//dateTime value is = "${time} years ago"

console.log(`${dateTime}`); //not working

console.log(`${time} years ago`);//working

【问题讨论】:

  • 定义“不工作”。第一个console.log() 调用实际上得到了什么输出?顺便说一句,标题中问题的答案是“是”。
  • 您确定dateTime 变量中有内容吗?尝试调试或只是console.log(dateTime)
  • 是的,我确定。控制台.log(${dateTime}); = "${time} years ago" console.log(${time} years ago); = "3 年前"
  • 这是一个老问题,但我认为罗伯托想问的是“你能以编程方式解析可能包含模板的变量吗?”。通过使用反引号,编译器将硬编码的字符串视为模板,但这仅适用于硬编码的字符串。他需要的是一个 function 来解析给定的字符串,我认为 Typescript 中不存在该字符串(至少直到 2018 年 12 月我写这篇文章时)。这样的函数也必须谨慎使用,因为它会允许代码注入。

标签: typescript interpolation


【解决方案1】:

由于您的字符串插值语法是正确的,这意味着dateTime 为空或空字符串。请将您记录的字符串的输出添加到您的问题和/或控制台中显示的任何错误中。

根据您下面的 cmets,您似乎在字符串插值中有一个字符串插值,其中第一个尚未被评估。

以下(基本)代码有效:

let time = "This is time";
let vari = `${time} | is what we got`;
let result = `${vari} | is this possible?`;
document.body.innerText = result;

...这将打印所有已解析变量的结果,但这是因为 TypeScript 知道如何将这些行分开并从中构造一个正常的连接。

在您的实例中,getTranslation() 似乎没有解析time,而是构造了一个带有插值标记的转义字符串。这需要适当解决。

由于 TypeScript 编译到不同的目标,并且字符串插值本质上是 TypeScript 在幕后进行字符串连接,因此您将不得不做一些跑腿工作来编写代码并评估生成的 JavaScript 以查看它是否提供了有效的输出将适当地解析变量。

转到 TypeScript play,并使用它来检查输出。您必须插入一些 getTranslation() 方法正在执行的操作,并查看输出是否会正确生成。

【讨论】:

  • 你好,在cmets中添加的结果,dateTime值是=“${time}年前”(带双引号)问题是dateTime的值并带双引号是一个字符串,所以插值不起作用,谢谢
  • 当您登录到实际控制台时,它会说什么(不仅仅是它是否工作)?在进行逐步调试时,dateTime 变量有什么值?
  • console.log(${dateTime}); = "${time} years ago" 控制台.log(${time} years ago); = "3 年前"
  • 更新了答案以反映您的 cmets。
【解决方案2】:

这很讨厌,但它确实有效:

const str = "Hello ${word}"
const word = "world"
const result = eval("`" + str + "`")
console.log(result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多