在Typescript中创建动态变量引用

时间:2016-03-01 19:22:03

标签: javascript typescript dynamic-variables variable-names

提前感谢任何帮助过的人。 :)

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

我目前正在从Actionscript转换为Typescript,并且对vanilla Javascript有相当多的经验,所以简单地用Javascript术语表示,如果我想动态引用变量,我可以简单地使用像这样:

.controller('loginCtrl', function($scope,loginInfoService) {
console.log(loginInfoService.getJsonId());
})

.factory('accessUrlService', ['$resource',function($resource){
return $resource('ip/Web/ws/login/restLogin');
}])


.factory('loginInfoService', ['accessUrlService',function(accessUrlService){

return  {
    getJsonId: function() {         
                accessUrlService.save({"login":"admin","password":"log","role":"Admin"},function(data){
                console.log(data.jsessionId);                           
                return data;                                
                });     
            }
        }

}])

结果当然是:"我想说你好!"

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

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

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

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

例如:

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

所以在循环中,我想要引用每个的a和b:

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

非常感谢任何帮助!!

2 个答案:

答案 0 :(得分:6)

我建议采用面向对象的'打字'做法。毕竟这就是为什么你可能想要使用typescript而不是javascript。 因此,在打字稿中,您可以通过以下方式执行此操作。为这个'赋予意义。你必须在某个班级内引用它。你的情况可能如下:

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());

答案 1 :(得分: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]]);