我目前正在尝试清理一些代码,以便针对接口而不是针对实现进行编程,但不知道如何去做。
更具体地说,我正在使用: * TypeScript 1.5.0 beta -> 转换为 ES5 / commonjs * SystemJS 来加载模块
我目前尝试使用如下外部模块:
post.service.ts 文件:
///<reference path="../../../typings/tsd.d.ts" />
///<reference path="../../../typings/typescriptApp.d.ts" />
...
export interface PostsService{ // 1
fetchPosts(): Rx.Observable<any>;
}
export var PostsService:PostsServiceImpl; // 2
...
export class PostsServiceImpl implements PostsService { // 3
...
constructor(){
console.log('Loading the Posts service');
}
...
fetchPosts(): Rx.Observable<any>{
...
}
并且该模块被导入到posts.ts中:
///<reference path="../../../typings/tsd.d.ts" />
///<reference path="../../../typings/typescriptApp.d.ts" />
import {PostsService, PostsServiceImpl} from 'components/posts/posts.service';
@Component({
selector: 'posts',
viewInjector: [
//PostsServiceImpl
//PostsService
bind(PostsService).toClass(PostsServiceImpl)
]
})
...
export class Posts {
private postsServices: PostsService;
constructor(postsService: PostsService) {
console.log('Loading the Posts component');
this.postsServices = postsService;
...
}
...
}
上面的代码编译正确,但基本上我的问题归结为 Angular 不会在 Posts 组件中注入 PostsServiceImpl 的实例。
当然这只是因为我没有找到正确的方法来声明/导出/导入所有内容
如果没有export interface PostsService ...
,我会收到 TS 编译错误,因为我在帖子控制器中使用它。
没有export var PostsService:PostsServiceImpl;
我在 @View 装饰器的 viewInjector 中得到 TS 编译错误
在生成的 js 代码中,我只找到exports.PostsService;
由于导出变量而添加的...我知道接口在运行时会消失。
所以我对这一切有点迷茫。任何实用的想法如何使用 TypeScript 和 Angular 2 的基于接口的编程?