2017-03-08 69 views
0

我正在使用Typescript寫一個MVC應用程序,但我有一些問題。如果我擴展我的BaseController並重寫ajaxMethod,那麼需要不同的參數,我的編譯器會報錯。希望可以有人幫幫我。使用不同參數的重寫方法擴展Typescript類不可能?

這裏是我的代碼:

interface i_Controller { 
    ajaxMethod; 
    ajaxSuccessListener; 
    ajaxErrorListener; 
} 

class BaseController implements i_Controller { 
    protected baseProperty: boolean; 

    constructor() { 
     this.baseProperty = true; 
    } 

    public ajaxMethod() { 
     $.when(
      $.ajax({}) 
     ).then(
      this.ajaxSuccessListener, 
      this.ajaxErrorListener 
     ) 
    } 

    public ajaxSuccessListener(data, status, jqXHR) { 
     console.log('ajax success'); 
     console.log(data); 
    }; 

    public ajaxErrorListener(jqXHR, status, error) { 
     console.error('ajax error'); 
     console.error(status); 
    }; 
} 


class Page_1_Controller extends BaseController { 
    private localProperty: number; 

    constructor(input) { 
     super(); 
     this.localProperty = input; 
    } 

    public ajaxMethod(someProperty) { 
     /* 
     /* Error:(39, 7) TS2415:Class 'Page_1_Controller' incorrectly 
     /* extends base class 'BaseController'. 
     /* Types of property 'ajaxMethod' are incompatible. 
     /* Type '(someProperty: any) => void' is not assignable to 
     /* type '() => void'. 
     */ 
     $.when(
      $.ajax({ 
       data: {properties: someProperty} 
      }), 
      $.ajax({}) 
     ).then(
      this.ajaxSuccessListener, 
      this.ajaxErrorListener 
     ) 
    } 

    public ajaxSuccessListener(responseAjaxRequest_1, responseAjaxRequest_2) { 
     console.log('ajax success'); 
     let data_1 = responseAjaxRequest_1[0]; 
     let data_2 = responseAjaxRequest_2[0]; 
     console.log(data_1); 
     console.log(data_2); 
    } 
} 

class MyApp { 
    private controller: i_Controller; 

    constructor() { 
     this.controller = new Page_1_Controller(); 
     /* 
     /* Error:(72, 27) TS2346:Supplied parameters do not match any 
     /* signature of call target. 
     */ 
     this.controller.ajaxMethod(); 
    } 
} 

此刻我不知道我在哪裏上延長我的課假。構造函數可以在沒有任何問題的情況下被覆蓋,也可以被監聽器覆蓋。爲什麼不是ajaxMethod?

+0

構造函數不能被繼承。在你的'Page_1_Controller'類中,你不覆蓋基礎構造函數,而是編寫一個新的構造函數。 –

+0

可能的重複:http://stackoverflow.com/questions/39799195/incorrectly-extends-base-class-static-side-error-when-overriding-static-fi –

+0

可能的重複['...錯誤地擴展基類靜態方'錯誤時重寫派生類中的靜態字段](http://stackoverflow.com/questions/39799195/incorrectly-extends-base-class-static-side-error-when-overriding-static-fi) –

回答

1

正如錯誤消息所述,兩個ajaxMethod()的簽名是不兼容的。

Page_1_Controller延伸BaseController時,得到ajaxMethod()的類型爲() => void。 這意味着如果您的實例Page_1_Controller被降級爲BaseController,它應該與該簽名一起使用。

考慮一下:

function foo(c: BaseController) { 
    c.ajaxMethod() 
} 
const page1 = new Page_1_Controller() 
foo(page1) 

您的代碼將無法處理這個問題。 這就是爲什麼編譯器會抱怨並幫助您在編譯期間捕獲此錯誤的原因。

爲了解決這個問題,你應該處理這種情況,如:

class Page_1_Controller extends BaseController { 
    ajaxMethod(someProperty?) { 
    if (someProperty) { 
     ... 
    } 
    else { 
     super.ajaxMethod() 
    } 
    } 
} 
+0

感謝您的解釋。幫助瞭解它是如何工作的 – mtizziani

相關問題