2016-03-14 6 views
1

ТЛ; Др: мне нужно иметь скомпилированную машинопись определения прототипа, примененное к объектам I определили быть из этого класса.Продлить объект JavaScript-прототип машинописи класса


Ситуация: мне нужно расширить объект JavaScript с помощью какой-то бизнес-логикой, определенной в классе машинопись.
Это может выглядеть примерно так:

class Address 
{ 
    constructor(
    public Street: string, 
    public Number: number, 
    public Zip: number, 
    public City: string) 
    { } 

    public get FullAddress() 
    { 
    return this.Street + ' ' + this.Number + ', ' 
     + this.Zip + ' ' + this.City; 
    } 
} 

Составленный JS добавляет код для расширения объекта-прототип FullAddress. Если я звоню new Address('Somestreet', 5, 3564, 'SomeCity'), все работает как шарм.


Проблема: когда я получаю некоторый объект JS (в моем случае с помощью углового-х $http)

$http.get('/api/address').then((answer: AngularPromise<Address[]>) => 
{ 
    console.log(answer.data[0].FullAddress()); 
}); 

Я могу вызвать функцию FullAddress на объекте, так как в машинописном функция определена на определение класса.

Теперь, когда я выполнить код в браузере answer.data.FullAddress() не определен (что имеет смысл, поскольку Машинопись только обеспечивает определение типа и никогда не касалась объекта


Покушения Решения:. Одно из возможных решений быть вызов конструктора для каждого объекта (несколько, как следующее)

$http.get('/api/address').then((answer: AngularPromise<Address[]>) => 
{ 
    for(var i = 0; i < answer.data.length; i++) 
    { 
    answer.data[0] = new Address(answer.data[0].Street, ans.....); 
    } 
    console.log(answer.data[0].FullAddress()); 
}); 

и, возможно, перегружать Address конструктор принять компл ete для уменьшения шаблона.


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

ответ

0

Если бы этот же выпуск! Один из способов идти, как вы сказали, состоит в том, чтобы создать конструктора и передать всю информацию - немного утомительно и кажется неправильным. Мы закончили делать MapTo функцию, которая может сопоставить общий объект для сильного класса:

public static MapTo(jsonObject, nameSpace, classType) { 
    var instance = new classType(); 
    for (var prop in jsonObject) { 
     if (!jsonObject.hasOwnProperty(prop)) { 
      continue; 
     } 

     if (jsonObject[prop] == null) { 
      instance[prop] = null; 
     } else if (typeof jsonObject[prop] === 'object') { 
      if (nameSpace[prop]) { 
       instance[prop] = this.MapTo(jsonObject[prop], nameSpace, nameSpace[prop]); 
      } else { 
       instance[prop] = jsonObject[prop]; 
      } 
     } else { 
      instance[prop] = jsonObject[prop]; 
     } 
    } 

    return instance; 
} 

И использование будет:

var strongAddress = MapTo(answer.data[0], Models, Models.Address); //I assumed your class was in a namespace called "Models" 
+0

Интересный подход ... все еще чувствует себя немного шаткий, но уже путь лучше. Моя проблема: я боюсь, что это работает только на внутренних модулях, правильно (поскольку я использую свои классы в Angular и NodeJS, я использую только внешние модули: |) – Aides

Смежные вопросы