【问题标题】:Typescript errors "incorrectly implements interface" Type 'Subject<boolean>' is not assignable to type 'Subject<boolean>'打字稿错误“错误地实现接口”类型'Subject<boolean>'不可分配给类型'Subject<boolean>'
【发布时间】:2016-12-17 13:22:48
【问题描述】:

Angular 2 和 Typescript 应用程序。

我在 NPM 包中有一个抽象类,我试图在我的应用程序代码中提供实现。这一切都很好,直到我添加了公共 isLoggedIn:Subject&lt;boolean&gt;; 属性。

current-user.service.ts

@Injectable()
export abstract class CurrentUserContextService {

public isLoggedIn:Subject<boolean>;
public userId:string;
public userName:string;
public email:string;
public scope:string[];

constructor() {  }

}

my-current-user.service.ts

@Injectable()
export class MyCurrentUserContextService implements CurrentUserContextService {

// interface properties.
public isLoggedIn:Subject<boolean>;
public userId: string;
public userName: string;
public email: string;
public scope: string[];

// add custom properties as needed.


constructor() { }

}

// add custom methods as needed.

}

ma​​in.ts

bootstrap(AppComponent, [    
MyCurrentUserContextService,
{provide: CurrentUserContextService, useExisting: MyCurrentUserContextService}
])

错误

“MyCurrentUserContextFactoryService”类错误地实现了“CurrentUserContextFactoryService”接口。 属性“currentUserContext”的类型不兼容。 类型“MyCurrentUserContextService”不可分配给类型“CurrentUserContextService”。 属性“isLoggedIn”的类型不兼容。 “主题”类型不能分配给“主题”类型。 属性“destination”受到保护,但类型“Subject”不是从“Subject”派生的类。

【问题讨论】:

  • 你能用extends代替implements吗?
  • 由于这是一个库,我需要强制开发人员使用它来提供实现,extends 不会强制执行。这个例子很简单,我有其他的类有期望开发者提供实现的方法。
  • 嗯,因为您将基类型声明为class,而不是interface,并且implements 应该仅用于interface。那么,为什么不将您希望开发人员实现的那些分离到另一个interface,并将这些具体的基实现保留在当前基类中呢?
  • 使用接口的问题是在 Angular 2 DI 中你不能注入接口,因为在运行时它们不存在。这种技术,使用“类接口”是解决方案。抽象类是可注入的,并允许使用自定义实现覆盖成员。

标签: angular typescript rxjs


【解决方案1】:

我发现了问题的根源.... Angular CLI 和 Broccoli!在花了一些时间整理一些项目来重现这个问题之后,我决定除了 CLI 生成的项目之外,还使用 ​​Angular 2 快速入门。

Angular 2 快速启动项目没有问题,但 Angular CLI 会产生错误,但不会失败。

因此,通过从我的工具链中删除 CLI 并编写我自己的工具代码,我可以获得对我的 TypeScript 应用程序的可靠编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 2016-06-24
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多