Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Angular2 и Typescript (https://javascript.ru/forum/angular/63886-angular2-i-typescript.html)

Grinev 06.07.2016 12:31

Angular2 и Typescript
 
Добрый день!

Нужна помощь, есть у меня вот такой вот сервис:
import { Injectable }     from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable }     from 'rxjs/Observable';

import { ResourceSettingType }   from './type';

@Injectable()
export class ResourceSettingTypeService {
    constructor (private http: Http) {

    }

    public url = '/backend/resource/setting/types';

    all(): Observable<ResourceSettingType[]> {
        return this.http.get(this.url)
            .map(this.extractData)
            .catch(this.handleError);
    }

    find(id: number): Observable<ResourceSettingType> {
        return this.http.get(this.url + '/' + id)
            .map(this.extractData)
            .catch(this.handleError);
    }

    delete(id: number): Observable<ResourceSettingType> {
        return this.http.delete(this.url + '/' + id)
            .map(this.extractData)
            .catch(this.handleError);
    }

    private extractData(res: Response) {
        let body = res.json();
        return body.data || { };
    }

    private handleError (error: any) {
        let errMsg = (error.message) ? error.message :
            error.status ? `${error.status} - ${error.statusText}` : 'Server error';
        console.error(errMsg); // log to console instead
        return Observable.throw(errMsg);
    }
}


Это все базовые CRUD операции и таких сервисов много, хочу это вынести в какой нибудь базовый сервис класс

import { Http, Response } from '@angular/http';
import { Observable }     from 'rxjs/Observable';

import { ResourceSettingType }   from './../../resource/setting/type/type';

export abstract class BaseService {
    public http;

    public url;
    
    all(): Observable<ResourceSettingType[]> {
        return this.http.get(this.url)
            .map(this.extractData)
            .catch(this.handleError);
    }

    find(id: number): Observable<ResourceSettingType> {
        return this.http.get(this.url + '/' + id)
            .map(this.extractData)
            .catch(this.handleError);
    }

    delete(id: number): Observable<ResourceSettingType> {
        return this.http.delete(this.url + '/' + id)
            .map(this.extractData)
            .catch(this.handleError);
    }

    private extractData(res: Response) {
        let body = res.json();
        return body.data || { };
    }

    private handleError (error: any) {
        let errMsg = (error.message) ? error.message :
            error.status ? `${error.status} - ${error.statusText}` : 'Server error';

        console.error(errMsg); // log to console instead
        return Observable.throw(errMsg);
    }
}


И использовать таким вот образом
import { Injectable }     from '@angular/core';
import { Http, Response } from '@angular/http';

import { BaseService } from './../../../common/components/base-service';

@Injectable()
export class ResourceSettingTypeService extends BaseService {
    public url = '/backend/resource/setting/types';
    
    constructor (private http: Http) {
        super();
    }
}



Но каким образом сделать Observable не могу понять, потому что для каждого сервиса свои Observable<ResourceSettingType> и т.д.

Каким образом это можно организовать?

Спасибо!


Часовой пояс GMT +3, время: 13:06.