angular - 角 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)
实现抽象服务是可行的,但缺点是我必须实现抽象服务的每个方法,无论它是在服务中实现的,还是抽象的。
解决方案
推荐阅读
- java - 在聊天应用程序中编辑文本发送功能
- r - Datatable DT包R - 嵌入ppt
- django - 为什么我们要使用 django-webpack-loader?
- react-native - 密钥不存在时的 AsyncStorage.getItem 行为
- google-cloud-dataflow - 任何人都可以将 Google 提供的 PubSub 的元数据文件提供给 BigQuery 模板吗?
- android - 从链接打开安卓应用
- json - 将 JSON 插入 Hadoop
- javascript - 在鼠标按下时,点击事件在反应中被触发
- javascript - 如何在 JavaScript 中以低开销访问两个数组作为关联数组?
- javascript - 在选择选项中变得未定义