angular – 如何在typescript中的泛型类中创建类型为’T’的新对
发布时间:2020-12-17 17:46:59 所属栏目:安全 来源:网络整理
导读:我有以下服务 @Injectable()export class CollectionServiceT { constructor(protected http: Http) {} factoryT(item?: any): T { let type: new (item?: any) = T; return new type(item); } item(id): ObservableT { return this.http.get(`${this.baseUr
我有以下服务
@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); }); } } 编译成功通过,但我在浏览器控制台中有下列错误 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) 如何创建T类型的对象? 解决方法
名称T仅在编译时存在.您可以将它用于类型检查,但除非您有权访问构造函数,否则无法构造类型为T的对象.
更改工厂的定义以将运行时类型构造函数作为参数: factory<T>(type: {new(): T},item?: any): T { return new type(item); } 现在唯一的问题是找出你得到类型参数的地方;您可能还需要将它传递给item()方法,以便编译器知道Observable< T>的类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |