2016-03-01 4 views
2

Спасибо заранее, всем, кто помогает. :)Создайте ссылку на динамическую переменную в машинописном файле

Это может показаться простым ответом для тех, кто имеет опыт, но я просмотрел Интернет, а также пару справочников и не нашел прямого ответа на этот вопрос, поэтому, надеюсь, это может быть из помогать другим.

В настоящее время я перехожу из ActionScript в Typcript и имею разумный опыт работы с ванильным Javascript, поэтому, если бы я хотел динамически ссылаться на переменную, я мог бы просто использовать что-то вроде этого :

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

Результатом, естественно, будет: «Я хочу сказать« Привет! ».

В Машинопись это не представляется возможным с частных переменных в классе, а также приводит к следующей ошибки TSC:

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

Насколько я понимаю, машинопись ожидает меня объявить переменный тип каким-то образом, внутри динамической конструкции, однако я не могу найти никакой четкой справки о том, как это сделать.

Для моих собственных целей, чтобы поместить это в контекст, я работаю над проектом, где мне нужно пройти через пару парных переменных, все из которых имеют одно и то же начало, но немного разные окончания, поэтому просто вставляя сами переменные в массив не является вариантом (или, во всяком случае, будет беспорядочным решением).

Например:

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

Таким образом, в цикле, я хотел бы обратиться и к а и Ь каждого:

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

Любая помощь очень ценится !!

+1

Вы наследовали эти имена переменных? Потому что в противном случае другая настройка ваших переменных может привести к другому (лучше?) Решению. –

+0

Привет, Саймон, да, к сожалению. Это ситуация, с которой мне нужно работать, и я просто пытался найти аккуратный способ доступа к ним. :) – wdlee

ответ

4

Я бы предложил пойти с ориентированным на объекты «типизированным» подходом. В конце концов, именно поэтому вы, вероятно, захотите использовать машинопись, а не 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()); 
+0

Спасибо Amid. Я использую типизированный подход (в основном, из фона ActionScript), но использовал пример Javascript, поскольку он почти такой же, как и в ActionScript (просто без ввода). Попытка доступа к закрытым переменным в классе в TypScript с использованием метода, который вы показали, является результатом ошибки TSC. – wdlee

+0

Я обновил образец с приватными свойствами. Обратите внимание на это, чтобы иметь возможность называть 'Test.CallMe 'извне, он все равно должен быть определен как public – Amid

+0

Я закончил back-engineering и шел по маршруту массива, как я бы сделал нормально. Тем не менее, было очень полезно увидеть примеры, и это заставляет меня больше привыкнуть к TypScript. Огромное спасибо! – wdlee

2

As far as I can gather, typescript expects me to declare the variable type in some way, within the dynamic construct, however I cannot find any clear reference on how to do this.

Вы должны указать 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]]);