首页 > 解决方案 > 角 12.2.9。和 TypeScript - 服务实现是否可以扩展它实现的抽象服务而不是实现它?

问题描述

我有一种情况,我有一些方法可以返回从 Web 服务调用接收到的数据;问题是,根据某些事情,Web 服务将返回已经符合这些方法需要返回的接口的数据,但在其他情况下,相同的方法将不得不处理数据,并返回适当的接口。

因此,我想将这些方法的签名放在一个抽象类中,该类将作为服务注入令牌,并且我想做两个不同的实现;一种方法接收和处理数据,另一种方法只返回他们收到的数据。

问题是,有一些方法的工作方式完全相同,无论实现如何;我想直接在抽象服务中实现的那些方法。

所以我的问题是,这可能吗:

一个抽象服务,有一些抽象方法,一些具体方法:

@Injectable({
  providedIn: 'root',
  useClass: TestServiceImpl
})
export abstract class TestService {

  abstract changableMethod(): void;

  fixedMethod(): void {
    console.log('fixed');
  }

}

扩展抽象服务的实现,并且只实现抽象方法。它被定义为使用抽象服务中的 useClass 属性的服务实现:

@Injectable({
    providedIn: 'root'
})
export class TestServiceImpl extends TestService {

    constructor() {
        super();
    }

    changableMethod() {
        console.log('changable');
    }
}

最后是组件中的服务实现,其中抽象方法调用从具体实现类调用方法,对非抽象方法的调用调用抽象服务类中实现的方法:

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  constructor(private testService: TestService) {}

  ngOnInit() {
    this.testService.changableMethod();
    this.testService.fixedMethod();
  }
}

TestService 类和 TestServiceImpl 类在代码的其他任何地方都没有被引用。

这样做会导致此错误:

[Error] ReferenceError: Cannot access uninitialized variable.
    TestService (main.js:496)
    (anonymous function) (main.js:473)
    __webpack_require__ (runtime.js:23)
    (anonymous function) (main.js:498:96)
    __webpack_require__ (runtime.js:23)
    (anonymous function) (main.js:64:91)
    __webpack_require__ (runtime.js:23)
    (anonymous function) (main.js:432:92)
    __webpack_require__ (runtime.js:23)
    (anonymous function) (main.js:552:93)
    __webpack_require__ (runtime.js:23)
    __webpack_exec__ (main.js:601)
    (anonymous function) (main.js:602:95)
    (anonymous function) (runtime.js:60)
    (anonymous function) (main.js:603)
    webpackJsonpCallback (runtime.js:151)
    webpackJsonpCallback
    Global Code (main.js:1)

实现抽象服务是可行的,但缺点是我必须实现抽象服务的每个方法,无论它是在服务中实现的,还是抽象的。

标签: angulartypescriptinheritancedependency-injectionabstract-class

解决方案


推荐阅读