【问题标题】:Types have separate declarations of a private property类型具有私有属性的单独声明
【发布时间】:2018-09-06 06:50:48
【问题描述】:

我正在学习 Angular(它是用 TypeScript 编写的),我偶然发现了这个错误:

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

当尝试从 @angular/material 扩展 MatSnackBar 时。

这是我的代码:

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, ...);
    }
  }
}

任何关于为什么会发生这种情况的解释的帮助将不胜感激。

【问题讨论】:

  • 让服务扩展组件有点奇怪!?虽然这不是直接关于你的问题,但它引起了我的皱眉????

标签: javascript typescript


【解决方案1】:

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

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

export class SnackbarService extends MatSnackBar{

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

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

【讨论】:

  • 在某些情况下,它可能是两个类中定义的重复属性
  • 在抽象基类中,构造函数参数仍然可以声明为private readonly,但派生类型不需要任何访问修饰符。
  • 显而易见的一点,但上面没有说明 - 如果你想在派生类中使用注入的成员,那么在基类中,构造函数参数不能声明为私有,而是通常受保护。跨度>
  • 在我的情况下,我必须在父组件中将属性更改为protected,以便能够通过this在子组件中访问它
【解决方案2】:

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

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

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

【讨论】:

  • 这是我的问题。
  • 非常多。我的依赖类型都完全相同,但由于版本不匹配仍然得到这个。
猜你喜欢
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多