类型具有私有财产的单独声明


73

我正在学习Angular(用TypeScript编写),但偶然发现了此错误:

类“ SnackbarService”错误地扩展了基类“ MatSnackBar”。类型具有私有属性“ _overlay”的单独声明。

尝试从扩展MatSnackBar@angular/material

这是我的代码:

import { MatSnackBar } from '@angular/material';
import { Overlay } from '@angular/cdk/overlay';
import { LiveAnnouncer } from '@angular/cdk/a11y';
...

export class SnackbarService extends MatSnackBar {

  constructor(
    private _overlay: Overlay, 
    private _liveAnnouncer: LiveAnnouncer,
    ...
  ) {
    super(_overlay, _liveAnnouncer, ...);
    }
  }
}

我们将不胜感激,感谢您提供任何有关这种情况发生原因的解释。


1
有服务扩展组件有点奇怪!虽然这不是直接左右你的问题就引起我的眉毛(S)😦的一颦
伯努利IT

Answers:


136

发生这种情况是因为通过将构造函数声明为带private _overlay参数,您已经创建了自己的参数_overlay,但是已经在基类中定义了它MatSnackBar

private从声明中删除该部分,并从基类继承它。对其他构造函数参数执行相同的操作。

export class SnackbarService extends MatSnackBar{

  constructor(
    _overlay: Overlay, 
    _liveAnnouncer: LiveAnnouncer,
    ...
  ) {
     super(_overlay, _liveAnnouncer, ...);
    }
  }
}

您仍然可以通过访问它们 this.


1
在某些情况下,它可以是两个类中定义的重复属性
FindOutIslamNow

在抽象基类中,构造函数参数仍可以声明为private readonly,但是派生类型确实不需要任何访问修饰符。
磷虾

10
显而易见的要点是,但在上面的任何地方都没有说明-如果要在派生类中使用注入的成员,则在基类中,不得将构造函数参数声明为私有,而是通常予以保护。
jjee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.