我想创建一个通用的api服务,以便更容易创建与模型相关的服务:
export abstract class ModelService<T> {
constructor(protected apiService: ApiService) {
//ApiService is a service that wraps Http and adds signature , auth and serialization.
}
public getAll(): Observable<T[]> {
return this.apiService.get<T[]>(this.modelClass, this.baseUrl);
}
}
然后,我将创建管理模型Foo
的服务:
@Injectabe()
export class FooService extends ModelService<Foo>{
}
但是当我致电fooService.getAll().subscribe(...);
时,我收到一条错误消息,指出apiService
未定义(无法获取属性&#39;未定义)。
所以解决方法是在FooService
中添加一个构造函数,如下所示:
constructor(api: ApiService) {
super(api);
}
但问题是它不是开发人员友好的,没有任何东西告诉你这样做,并且因为FooService
扩展ModelService
,它应该具有相同的构造函数,因此具有相同的依赖关系。 / p>
有没有办法继承依赖?
PS:我已尝试将@Injectable()
添加到ModelService
,同样的错误。
编辑:tsconfig.json
:
{
"compilerOptions": {
"baseUrl": "",
"declaration": false,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": [
"es6",
"dom"
],
"mapRoot": "./",
"module": "es6",
"moduleResolution": "node",
"outDir": "../dist/out-tsc",
"sourceMap": true,
"target": "es5",
"typeRoots": [
"../node_modules/@types"
]
}
}
package.json
:
"dependencies": {
"@angular/common": "2.2.1",
"@angular/compiler": "2.2.1",
"@angular/core": "2.2.1",
"@angular/forms": "2.2.1",
"@angular/http": "2.2.1",
"@angular/platform-browser": "2.2.1",
"@angular/platform-browser-dynamic": "2.2.1",
"@angular/router": "3.2.1",
...
...
},
"devDependencies": {
"@angular/compiler-cli": "2.2.1",
...
...
}
答案 0 :(得分:5)
构造函数需要重复依赖项,然后使用super(...)
@Injectabe()
export class FooService extends ModelService<Foo>{
constructor(apiService: ApiService) {
super(apiService);
//ApiService is a service that wraps Http and adds signature , auth and serialization.
}
}
这不是Angular2的要求或限制,这就是构造函数在TypeScript中的工作方式。