Skip to content

Commit 4120437

Browse files
HennerMghidoz
authored andcommitted
Make parameters and return values of JsonApiDatastore generic (#31)
1 parent 0766280 commit 4120437

File tree

2 files changed

+24
-24
lines changed

2 files changed

+24
-24
lines changed

src/models/json-api.model.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export class JsonApiModel {
2323
}
2424
}
2525

26-
save(params?: any, headers?: Headers): Observable<JsonApiModel> {
26+
save(params?: any, headers?: Headers): Observable<this> {
2727
let attributesMetadata: any = Reflect.getMetadata('Attribute', this);
2828
return this._datastore.saveRecord(attributesMetadata, this, params, headers);
2929
}
@@ -69,7 +69,7 @@ export class JsonApiModel {
6969
let relationship: any = data.relationships ? data.relationships[metadata.relationship]: null;
7070
if (relationship && relationship.data && relationship.data.length > 0) {
7171
let typeName: string = relationship.data[0].type;
72-
let modelType: ModelType = Reflect.getMetadata('JsonApiDatastoreConfig', this._datastore.constructor).models[typeName];
72+
let modelType: ModelType<this> = Reflect.getMetadata('JsonApiDatastoreConfig', this._datastore.constructor).models[typeName];
7373
let relationshipModel: JsonApiModel[] = this.getHasManyRelationship(modelType, relationship.data, included, typeName, level);
7474
if (relationshipModel.length > 0) {
7575
this[metadata.propertyName] = relationshipModel;
@@ -88,7 +88,7 @@ export class JsonApiModel {
8888
let dataRelationship: any = (relationship.data instanceof Array) ? relationship.data[0] : relationship.data;
8989
if (dataRelationship) {
9090
let typeName: string = dataRelationship.type;
91-
let modelType: ModelType = Reflect.getMetadata('JsonApiDatastoreConfig', this._datastore.constructor).models[typeName];
91+
let modelType: ModelType<this> = Reflect.getMetadata('JsonApiDatastoreConfig', this._datastore.constructor).models[typeName];
9292
let relationshipModel: JsonApiModel = this.getBelongsToRelationship(modelType, dataRelationship, included, typeName, level);
9393
if (relationshipModel) {
9494
this[metadata.propertyName] = relationshipModel;
@@ -99,12 +99,12 @@ export class JsonApiModel {
9999
}
100100
}
101101

102-
private getHasManyRelationship(modelType: ModelType, data: any, included: any, typeName: string, level: number): JsonApiModel[] {
103-
let relationshipList: JsonApiModel[] = [];
102+
private getHasManyRelationship<T extends this>(modelType: ModelType<T>, data: any, included: any, typeName: string, level: number): T[] {
103+
let relationshipList: T[] = [];
104104
data.forEach((item: any) => {
105105
let relationshipData: any = _.find(included, {id: item.id, type: typeName});
106106
if (relationshipData) {
107-
let newObject: JsonApiModel = this.createOrPeek(modelType, relationshipData);
107+
let newObject: T = this.createOrPeek(modelType, relationshipData);
108108
if (level <= 1) {
109109
newObject.syncRelationships(relationshipData, included, level + 1);
110110
}
@@ -115,11 +115,11 @@ export class JsonApiModel {
115115
}
116116

117117

118-
private getBelongsToRelationship(modelType: ModelType, data: any, included: any, typeName: string, level: number): JsonApiModel {
118+
private getBelongsToRelationship<T extends this>(modelType: ModelType<T>, data: any, included: any, typeName: string, level: number): T {
119119
let id: string = data.id;
120120
let relationshipData: any = _.find(included, {id: id, type: typeName});
121121
if (relationshipData) {
122-
let newObject: JsonApiModel = this.createOrPeek(modelType, relationshipData);
122+
let newObject: T = this.createOrPeek(modelType, relationshipData);
123123
if (level <= 1) {
124124
newObject.syncRelationships(relationshipData, included, level + 1);
125125
}
@@ -128,12 +128,12 @@ export class JsonApiModel {
128128
return this._datastore.peekRecord(modelType, id);
129129
}
130130

131-
private createOrPeek(modelType: ModelType, data: any): JsonApiModel {
131+
private createOrPeek<T extends this>(modelType: ModelType<T>, data: any): T {
132132
let peek = this._datastore.peekRecord(modelType, data.id);
133133
if (peek) {
134134
return peek;
135135
}
136-
let newObject: JsonApiModel = new modelType(this._datastore, data);
136+
let newObject: T = new modelType(this._datastore, data);
137137
this._datastore.addToStore(newObject);
138138
return newObject;
139139
}

src/services/json-api-datastore.service.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'rxjs/add/operator/catch';
88
import 'rxjs/add/observable/throw';
99
import { JsonApiModel } from '../models/json-api.model';
1010

11-
export type ModelType = { new(datastore: JsonApiDatastore, data: any): JsonApiModel; };
11+
export type ModelType<T extends JsonApiModel> = { new(datastore: JsonApiDatastore, data: any): T; };
1212

1313
@Injectable()
1414
export class JsonApiDatastore {
@@ -19,28 +19,28 @@ export class JsonApiDatastore {
1919
constructor(private http: Http) {
2020
}
2121

22-
query(modelType: ModelType, params?: any, headers?: Headers): Observable<JsonApiModel[]> {
22+
query<T extends JsonApiModel>(modelType: ModelType<T>, params?: any, headers?: Headers): Observable<T[]> {
2323
let options: RequestOptions = this.getOptions(headers);
2424
let url: string = this.buildUrl(modelType, params);
2525
return this.http.get(url, options)
2626
.map((res: any) => this.extractQueryData(res, modelType))
2727
.catch((res: any) => this.handleError(res));
2828
}
2929

30-
findRecord(modelType: ModelType, id: string, params?: any, headers?: Headers): Observable<JsonApiModel> {
30+
findRecord<T extends JsonApiModel>(modelType: ModelType<T>, id: string, params?: any, headers?: Headers): Observable<T> {
3131
let options: RequestOptions = this.getOptions(headers);
3232
let url: string = this.buildUrl(modelType, params, id);
3333
return this.http.get(url, options)
3434
.map((res: any) => this.extractRecordData(res, modelType))
3535
.catch((res: any) => this.handleError(res));
3636
}
3737

38-
createRecord(modelType: ModelType, data?: any): JsonApiModel {
38+
createRecord<T extends JsonApiModel>(modelType: ModelType<T>, data?: any): T {
3939
return new modelType(this, {attributes: data});
4040
}
4141

42-
saveRecord(attributesMetadata: any, model?: any, params?: any, headers?: Headers): Observable<JsonApiModel> {
43-
let modelType = model.constructor;
42+
saveRecord<T extends JsonApiModel>(attributesMetadata: any, model?: T, params?: any, headers?: Headers): Observable<T> {
43+
let modelType = <ModelType<T>>model.constructor;
4444
let typeName: string = Reflect.getMetadata('JsonApiModelConfig', modelType).type;
4545
let options: RequestOptions = this.getOptions(headers);
4646
let relationships: any = !model.id ? this.getRelationships(model) : undefined;
@@ -75,12 +75,12 @@ export class JsonApiDatastore {
7575
.catch((res: any) => this.handleError(res));
7676
}
7777

78-
peekRecord(modelType: ModelType, id: string): JsonApiModel {
78+
peekRecord<T extends JsonApiModel>(modelType: ModelType<T>, id: string): T {
7979
let type: string = Reflect.getMetadata('JsonApiModelConfig', modelType).type;
8080
return this._store[type] ? this._store[type][id] : null;
8181
}
8282

83-
peekAll(modelType: ModelType): JsonApiModel[] {
83+
peekAll<T extends JsonApiModel>(modelType: ModelType<T>): T[] {
8484
let type = Reflect.getMetadata('JsonApiModelConfig', modelType).type;
8585
return _.values(<JsonApiModel>this._store[type]);
8686
}
@@ -89,7 +89,7 @@ export class JsonApiDatastore {
8989
this._headers = headers;
9090
}
9191

92-
private buildUrl(modelType: ModelType, params?: any, id?: string): string {
92+
private buildUrl<T extends JsonApiModel>(modelType: ModelType<T>, params?: any, id?: string): string {
9393
let typeName: string = Reflect.getMetadata('JsonApiModelConfig', modelType).type;
9494
let baseUrl: string = Reflect.getMetadata('JsonApiDatastoreConfig', this.constructor).baseUrl;
9595
let idToken: string = id ? `/${id}` : null;
@@ -115,11 +115,11 @@ export class JsonApiDatastore {
115115
return relationships;
116116
}
117117

118-
private extractQueryData(res: any, modelType: ModelType): JsonApiModel[] {
118+
private extractQueryData<T extends JsonApiModel>(res: any, modelType: ModelType<T>): T[] {
119119
let body: any = res.json();
120-
let models: JsonApiModel[] = [];
120+
let models: T[] = [];
121121
body.data.forEach((data: any) => {
122-
let model: JsonApiModel = new modelType(this, data);
122+
let model: T = new modelType(this, data);
123123
this.addToStore(model);
124124
if (body.included) {
125125
model.syncRelationships(data, body.included, 0);
@@ -130,7 +130,7 @@ export class JsonApiDatastore {
130130
return models;
131131
}
132132

133-
private extractRecordData(res: any, modelType: ModelType, model?: JsonApiModel): JsonApiModel {
133+
private extractRecordData<T extends JsonApiModel>(res: any, modelType: ModelType<T>, model?: T): T {
134134
let body: any = res.json();
135135
if (model) {
136136
model.id = body.data.id;
@@ -208,7 +208,7 @@ export class JsonApiDatastore {
208208
return _.keyBy(modelsArray, 'id');
209209
}
210210

211-
private resetMetadataAttributes(res: any, attributesMetadata: any, modelType: ModelType) {
211+
private resetMetadataAttributes<T extends JsonApiModel>(res: any, attributesMetadata: any, modelType: ModelType<T>) {
212212
attributesMetadata = Reflect.getMetadata('Attribute', res);
213213
for (let propertyName in attributesMetadata) {
214214
if (attributesMetadata.hasOwnProperty(propertyName)) {

0 commit comments

Comments
 (0)