Tôi không biết nếu nó là có thể với giao diện như giao diện sẽ không có sẵn tại thời gian chạy (javascript không biết về giao diện). Nhưng nó có thể được thực hiện bằng cách sử dụng các lớp trừu tượng.
//abstract-parent-service.ts
export class DatabaseService{
getService:()=>string;
}
//hibernate.service.ts
import {DatabaseService} from "./abstract-parent-service";
export class HibernateService implements DatabaseService{
constructor() { }
getService() {
return "i am hibernate";
}
}
//jdbc.service.ts
import {DatabaseService} from "./abstract-parent-service";
export class JDBCService implements DatabaseService{
constructor() { }
getService() {
return "i am Jdbc";
}
}
// cmp-a.component.ts
import {DatabaseService} from "./abstract-parent-service";
import {HibernateService} from "./hibernate.service";
@Component({
selector: 'cmp-a',
template: `<h1>Hello Hibernate</h1>`,
providers: [{provide: DatabaseService, useClass: HibernateService}]
})
export class CmpAComponent {
constructor (private databaseService: DatabaseService) {
console.log("Database implementation in CompA :"+this.databaseService.getService());
}
}
//cmp-b.component.ts
import {DatabaseService} from "./abstract-parent-service";
import {HibernateService} from "./hibernate.service";
@Component({
selector: 'cmp-b',
template: `<h1>Hello Jdbc</h1>`,
providers: [{provide: DatabaseService, useClass: JDBCService}]
})
export class CmpAComponent {
constructor (private databaseService: DatabaseService) {
console.log("Database implementation in CompA :"+this.databaseService.getService());
}
}
Nhưng vấn đề với việc thực hiện này là HibernateService và JDBCService không thể mở rộng bất kỳ lớp khác bây giờ bởi vì họ đã kết hôn với DatabaseService .
class A{
constructor(){
console.log("in A");
}
}
class B extends A{
constructor(){
super();
console.log("in B");
}
}
class C extends A{
constructor(){
super();
console.log("in C");
}
}
let c = new C();
//This thing is not possible in typescript
class D extends B, C{//error: Classes can only extend a single class
constructor(){
super();// which constructor B or C
console.log("in D");
}
}
Nếu bạn đang sử dụng mô hình này cho DI, làm cho nó chắc chắn rằng các dịch vụ lớp con của bạn sẽ không mở rộng bất kỳ chức năng khác trong tương lai.
Nguồn
2016-07-16 07:44:01
lý do tại sao 'mới OpaqueToken ("LoginService") 'nhận được thông qua' LoginService' và không phải 'ILoginService'? –