2017-03-08 46 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

相关问题