【发布时间】:2016-12-17 13:22:48
【问题描述】:
Angular 2 和 Typescript 应用程序。
我在 NPM 包中有一个抽象类,我试图在我的应用程序代码中提供实现。这一切都很好,直到我添加了公共 isLoggedIn:Subject<boolean>; 属性。
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.
}
main.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