Typescript类继承

时间:2018-07-24 13:36:51

标签: angular typescript

我正在尝试扩展基类并收到以下错误:

  

类'DerivedProduct'错误地扩展了基类'BaseProduct'。
  类型具有私有属性“ route”的单独声明。

基本类别:

 export class BaseProduct {
    constructor(private route: ActivatedRoute, private store: Store<fromState>){}
   }

派生类:

export class DerivedProduct extends BaseProduct {
  constructor(private route: ActivatedRoute, private store: Store<fromState>){}
}

为什么会出现此错误?

2 个答案:

答案 0 :(得分:7)

字段已经在基类中声明,因此您无需重新声明它们(即,无需指定修饰符)。构造函数参数应该只是派生类中的参数,而不是字段中的参数。您还需要调用super构造函数

export class BaseProduct {
    constructor(private route: ActivatedRoute, private store: Store<fromState>) { }
}

export class DerivedProduct extends BaseProduct {
    constructor(route: ActivatedRoute, store: Store<fromState>) { 
        super(route, store)
    }
}

注意,您可以使用构造函数参数为字段语法糖添加额外的字段,但通常不应重新声明基本字段。如果重新声明公共字段和受保护字段,但不会重新声明私有字段,通常不会导致问题。

如果要访问派生类中的那些字段,请将修饰符更改为基类中的protectedpublic

修改

@ series0ne指出,如果您对构造函数没有任何额外的逻辑,则可以将其全部省略,因为它将继承自基类:

export class BaseProduct {
    constructor(private route: ActivatedRoute, private store: Store<fromState>) { }
}

export class DerivedProduct extends BaseProduct {
}
new DerivedProduct(route, store); //Works, also Angular should see it like this as well.

答案 1 :(得分:1)

在这两个构造函数中,您都在route参数上使用了关键字 private private route: ActivatedRoute。 当您使用private关键字时,实际上是在说构造函数中的参数也是您的类的成员。因此BaseProduct有一个成员route,并且您也在DerivedProduct中声明了相同的成员,这就是您遇到错误的原因。

解决方案

BaseProduct中设置路由受保护

 export class BaseProduct {
    constructor(protected route: ActivatedRoute, protected store: Store<fromState>){}
}

然后在派生类中,不要使用private关键字,而是将参数传递给super类。

export class DerivedProduct extends BaseProduct {
    constructor(route: ActivatedRoute, store: Store<fromState>){
       super(route, store);
       // this.route.doWhateverYouWantWithIt(this.store);....
    }
}

您将同时作为基类和派生类中的类成员访问routestore