gpt4 book ai didi

angular - typescript 通用服务

转载 作者:太空狗 更新时间:2023-10-29 16:51:42 27 4
gpt4 key购买 nike

我是 typescript 和 angular2/4 的新手,我正在构建一个应用程序,它有两个基本实体,即 Car 和 Driver,我所做的就是通过 API 调用列出它们。

我面临的问题是我对每个 CarService 和 DriverService 都有代码冗余,而且我可能对其他实体服务有相同的代码。

到目前为止,实现如下,跳过其他方法进行说明:

@Injectable()
export class CarService {

private actionUrl: string;
private headers: Headers;

constructor(private _http: Http, private _configuration: Configuration) {

// Getting API URL and specify the root
this.actionUrl = _configuration.serverWithApiUrl + 'Car/';

this.headers = new Headers();
this.headers.append('Content-Type', 'application/json');
this.headers.append('Accept', 'application/json');
}

// Function to get all Cars - API CALL: /
public GetAll = (): Observable<Car[]> => {
return this._http.get(this.actionUrl)
.map((response: Response) => <Car[]>response.json())
.catch(this.handleError);
}

// Function to get a Car by specific id - API CALL: /:id
public GetSingle = (id: number): Observable<Car> => {
return this._http.get(this.actionUrl + id)
.map((response: Response) => <Car>response.json())
.catch(this.handleError);
}

// Function to add a Car - API CALL: /create
public Add = (newCar: Car): Observable<Car> => {
return this._http.post(this.actionUrl + '/create', JSON.stringify(newCar), { headers: this.headers })
.catch(this.handleError);
}

// Function to update a Car - API CALL: /
public Update = (id: number, CarToUpdate: Car): Observable<Car> => {
return this._http.put(this.actionUrl + id, JSON.stringify(CarToUpdate), { headers: this.headers })
.catch(this.handleError);
}

// Function to delete a Car - API CALL: /:id
public Delete = (id: number): Observable<Response> => {
return this._http.delete(this.actionUrl + id)
.catch(this.handleError);
}

// Function to throw errors
private handleError(error: Response) {
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}

DriverService 的唯一变化是 Car/在 url 的末尾和 Observable<Car[]> 中的数据类型和回应。

我想知道使用通用服务避免这种情况的最佳方法是什么,以及如何在 Typescript 中做到这一点。

最佳答案

您可以创建一个抽象泛型类和两个继承自它的子类:

抽象类:

export abstract class AbstractRestService<T> {
constructor(protected _http: Http, protected actionUrl:string){
}

getAll():Observable<T[]> {
return this._http.get(this.actionUrl).map(resp=>resp.json() as T[]);
}
getOne(id:number):Observable<T> {
return this._http.get(`${this.actionUrl}${id}`).map(resp=>resp.json() as T);
}
}

司机服务等级

@Injectable()
export class DriverService extends AbstractRestService<Driver> {
constructor(http:Http,configuration:Configuration){
super(http,configuration.serverWithApiUrl+"Driver/");
}
}

汽车服务等级

@Injectable()
export class CarService extends AbstractRestService<Car> {
constructor(http:Http,configuration:Configuration) {
super(http,configuration.serverWithApiUrl+"Car/");
}
}

请注意,只有具体类被标记为 @Injectable() 并且应该在模块内声明,而抽象类则不应该。

Angular 4+ 更新

Http 类被弃用,取而代之的是 HttpClient,您可以将抽象类更改为类似的东西:

export abstract class AbstractRestService<T> {
constructor(protected _http: HttpClient, protected actionUrl:string){
}

getAll():Observable<T[]> {
return this._http.get(this.actionUrl) as Observable<T[]>;
}

getOne(id:number):Observable<T> {
return this._http.get(`${this.actionUrl}${id}`) as Observable<T>;
}
}

关于angular - typescript 通用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44129817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com