类型具有私有属性的单独声明

Mik*_* Me 30 javascript typescript angular

我正在学习Angular,我偶然发现了这个错误:

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

当试图从@ angular/material扩展MatSnackBar时.

这是我的代码:

import { Injectable, Injector } from '@angular/core';
import { MatSnackBar } from '@angular/material';
import { Overlay } from '@angular/cdk/overlay';
import { LiveAnnouncer } from '@angular/cdk/a11y';
import { BreakpointObserver } from '@angular/cdk/layout';

@Injectable()
export class SnackbarService extends MatSnackBar{

  constructor(
    private _overlay: Overlay, 
    private _liveAnnouncer: LiveAnnouncer,
    private _injector: Injector,
    private _breakPointObserver: BreakpointObserver,
    private _matSnackBar: MatSnackBar) {

      super(_overlay, _liveAnnouncer, _injector, _breakPointObserver, _matSnackBar);
     }

}
Run Code Online (Sandbox Code Playgroud)

任何关于为什么会发生这种情况的解释的任何帮助都将非常感激.

Sur*_*yan 74

因为您已经创建了自己的_overlay,已经在基类中定义了MatSnackBar.private从声明中删除该部分并从基类继承它.为其他人做同样的事情.

@Injectable()
export class SnackbarService extends MatSnackBar{

  constructor(
    _overlay: Overlay, 
    _liveAnnouncer: LiveAnnouncer,
     _injector: Injector,
    _breakPointObserver: BreakpointObserver,
    _matSnackBar: MatSnackBar) {

      super(_overlay, _liveAnnouncer, _injector, _breakPointObserver, _matSnackBar);
     }

}
Run Code Online (Sandbox Code Playgroud)

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

  • 显而易见,但上面没有说明 - 如果您想在派生类中使用注入的成员,那么在基类中,构造函数参数不得声明为私有,而通常为受保护。 (17认同)
  • 就我而言,我必须在父组件中将属性更改为“protected”,以便能够通过“this”在子组件中访问它 (3认同)
  • 在某些情况下,它可能是两个类中定义的重复属性 (2认同)

Anu*_*hra 11

在依赖项版本不匹配的情况下也会发生这种情况。[从打字稿的角度来看]

例如,如果您的应用A使用包B 的1.0 版和包C 的1.0 版。但是包 C 使用包B的不同版本,比如 2.0。

现在您在整个构建过程中有两个具有相同名称的不同类。要解决它,您必须升级包 C 或升级包 B,以便在应用程序中具有相同的版本。

  • Very much this. The dependency typings on mine were all exactly identical and still got this due to a version mismatch. (3认同)