I have the following service
@Injectable()
export class CollectionService<T> {
constructor(protected http: Http) {}
factory<T>(item?: any): T {
let type: new (item?: any) => T;
return new type(item);
}
item(id): Observable<T> {
return this.http.get(`${this.baseUrl}/${id}`)
.map((resp: Response)=> this.factory(resp.json()))
.catch((error: any) => {
return Observable.throw(error);
});
}
}
Compilation passes successfully, but i have folowing error in browser console
TypeError: type is not a constructor
at PortalVideoService.webpackJsonp.../../../../../src/app/services/collection/collection.service.ts.CollectionService.factory (http://localhost:4200/main.bundle.js:1568:16)
at http://localhost:4200/main.bundle.js:1580:64
at Array.map (native)
at MapSubscriber.project (http://localhost:4200/main.bundle.js:1580:29)
at MapSubscriber.webpackJsonp.../../../../rxjs/operator/map.js.MapSubscriber._next (http://localhost:4200/vendor.bundle.js:24034:35)
at MapSubscriber.webpackJsonp.../../../../rxjs/Subscriber.js.Subscriber.next (http://localhost:4200/vendor.bundle.js:13455:18)
at XMLHttpRequest.onLoad (http://localhost:4200/vendor.bundle.js:101703:38)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (http://localhost:4200/polyfills.bundle.js:2838:31)
at Object.onInvokeTask (http://localhost:4200/vendor.bundle.js:93420:37)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (http://localhost:4200/polyfills.bundle.js:2837:36)
How can I create an object of type T?
The name T
only exists at compile time. You can use it for type checking but you cannot construct an object of type T unless you have access to the constructor.
Change the definition of factory
to take the runtime type constructor as an argument:
factory<T>(type: {new(): T}, item?: any): T {
return new type(item);
}
Now the only problem will be working out where you get the type argument; you probably also need to pass it into the item()
method so that the compiler knows what type to make the Observable<T>
.