2017-02-10 11 views
0

Мы используем классы TypeScript с наследованием и сталкиваемся с очевидной проблемой. TypeScript/JavaScript не позволяет нам называть «супер» из структуры обещаний (или даже из закрытой функции). Мы получаем эту ошибку:Наследование типа TypeScript: «супер» может ссылаться только на членов производных классов или условных выражений объекта

Машинописи: «супер» может быть только Реферированы в членах производных классов или объектах Буквенных выражений

Есть ли способ обойти это? Вот код:

export class VendorBill extends Transaction { 
    constructor() { 
     super(); 
    } 

    save() { 

     let deferred = $.Deferred(); 

     $.ajax({ 
      type: "GET", 
      url: '/myrestapi', 
      success: function (data) {  
       deferred.resolve();  
      }, 
      error: function (jqXHR: any, textStatus, errorThrown) { 
       deferred.reject() 
      } 
     }) 

     $.when(deferred).always(function() { 
      super.save(); <----------- THIS IS CAUSING THE ERROR 
     })  
    } 
} 
+0

Также стоит отметить, что вы используете обещание антипаттерн использовать дополнительный отложенный объект, когда он не нужен. Вы можете просто сделать '$ .ajax ({...}). Always (() => {super.save();});' – Adam

ответ

3

Причина заключается в том, что компилятор превращает super.save() в:

_super.prototype.fn.call(this); 

Но this не является правильной, потому что один вы передаете функцию, которая не связана с правильный контекст.

Вы можете использовать arrow function:

$.when(deferred).always(() => { 
    super.save(); 
}) 
+0

Это сработало! Спасибо – ASA2