【问题标题】:Create a dynamic variable reference in Typescript在 Typescript 中创建动态变量引用
【发布时间】:2016-03-01 19:22:03
【问题描述】:

提前感谢所有提供帮助的人。 :)

对于那些有经验的人来说,这似乎是一个简单的答案,但我已经搜索了互联网以及一些参考书,并没有找到这个问题的直接答案,所以希望它可能对其他人有所帮助也是。

我目前正在从 Actionscript 过渡到 Typescript,并且对 vanilla Javascript 有相当多的经验,所以简单地用 Javascript 术语来说,如果我想动态引用一个变量,我可以简单地使用这样的东西:

var myTextA = "Hello!";
var myTextB = "Goodbye!";
var textList = ["A", "B"];
console.log("I want to say " + this["myText" + textList[0]]);

结果当然是:“我想打声招呼!”

在 Typescript 中,使用类中的 私有变量 似乎是不可能的,并导致以下 TSC 错误:

"Index signature of object type implicitly has an 'any' type."

据我所知,typescript 希望我在动态构造中以某种方式声明变量类型,但是我找不到任何关于如何执行此操作的明确参考。

出于我自己的目的,为了把它放在上下文中,我正在做一个项目,我需要循环一系列成对的变量,这些变量都有相同的开头,但结尾略有不同,所以只需将变量本身放在一个数组不是一个选项(或者无论如何都是一个混乱的解决方案)。

例如:

var myVar1a, myVar1b, myVar2a, myVar2b etc...

所以在循环中,我想同时引用 a 和 b:

console.log(this["myVar" + (i+1) + "a");
console.log(this["myVar" + (i+1) + "b");

非常感谢任何帮助!

【问题讨论】:

  • 您是否“继承”了这些变量名?因为否则变量的不同设置可能会导致另一个(更好的?)解决方案。
  • 嗨,西蒙,是的,很遗憾。这就是我必须处理的情况,我只是想找到一种访问它们的简洁方法。 :)

标签: javascript typescript dynamic-variables variable-names


【解决方案1】:

我建议采用面向对象的“类型化”方法。毕竟这就是为什么你可能想要使用 typescript 而不是 javascript。 因此,在打字稿中,您将按以下方式执行此操作。要赋予“this”意义,您必须在某个类中引用它。你的情况可能是这样的:

class Test
{
    private myTextA = "Hello!";
    private myTextB = "Goodbye!";
    private textList = ["A", "B"];

    public callMe()
    {
        console.log("I want to say " + this["myText" + this.textList[0]]);
    }
}

console.log((new Test()).callMe());

【讨论】:

  • 感谢 Amid。我正在使用类型化方法(主要来自 Actionscript 背景),但使用了 Javascript 示例,因为它与我在 Actionscript 中的操作方式几乎相同(只是没有打字)。尝试使用您显示的方法在 Typescript 中访问类中的私有变量似乎会导致 TSC 错误。
  • 我更新了带有私有属性的示例。请注意,为了能够从外部调用“Test.CallMe”方法,它仍必须定义为公共
  • 我最终进行了反向工程并采用了阵列路线,就像我通常会做的那样。但是,查看示例非常有帮助,它让我更加习惯了 Typescript。非常感谢!
【解决方案2】:

据我所知,typescript 希望我在动态构造中以某种方式声明变量类型,但是我找不到任何关于如何执行此操作的明确参考。

您需要指定index 签名。例如:

// Here you are saying that map is something that when accessed by a string returns a string
var map: {[key:string]:string} = {};  


map['myTextA'] = "Hello!";
map['myTextB'] = "Goodbye!";
var textList = ["A", "B"];
console.log("I want to say " + map["myText" + textList[0]]);

【讨论】:

    猜你喜欢
    • 2012-01-21
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多