我正在尝试创建一个通用的 DeleteableConfirmationComponent
,这将允许我显示一个确认对话框,并从实现 Deleteable
infterface的任何注入服务中调用 delete
方法 .
为此,我创建了这个接口:
export interface Deleteable {
delete(object);
}
我有一个实现它的服务:
@Injectable()
export class LocalityService implements Deleteable {
delete(locality): Observable<Locality> {
// Delete logic.
}
}
对于 DeleteableConfirmationComponent
,我试图使用构造函数注入服务:
export class DeleteableConfirmationComponent {
constructor(
public dialog: MdDialogRef<DeleteableConfirmationComponent>,
@Inject(MD_DIALOG_DATA) public data: any,
private service: Deleteable
) {}
delete() {
this.service.delete(this.object)
.subscribe(() => {
this.dialog.close();
});
}
}
但不幸的是,我有一个错误说 it can't resolve all parameters for DeleteableConfirmationComponent .
现在,我正在使用对话框数据选项,以便传递我的服务:
confirmDelete(locality) {
this.dialog.open(DeleteableConfirmationComponent, {
data: {
service: this.localityService
}
});
}
但它感觉很脏,并允许注入任何类型的服务,而我想强制实现 Deleteable
接口的服务 .
我以为我可能会更好地使用 abstract class
,但我更喜欢继承的构图 .
任何想法或最佳实践建议?
2 回答
InjectionToken
可以替换已弃用的OpaqueToken
如评论中所述,您可以将接口转换为抽象类:
然后在您的提供商中,您可以将其映射到真实的类:
你可能不喜欢这种方法,因为现在似乎
LocalityService
必须扩展Deleteable
. 但是如果LocalityService
需要扩展其他类呢?不允许多重继承:或者您可能根本不喜欢
Deleteable
现在将出现在LocalityService
原型链中的事实:但是,如this answer所示,TypeScript允许您将类视为接口 . 因此,您可以将
implements
与抽象类一起使用 .因此,对于所有意图和目的,您的抽象类现在表现得像一个接口 . 它甚至不会出现在原型链中 .