作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下服务
@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
的定义将运行时类型构造函数作为参数:
factory<T>(type: {new(): T}, item?: any): T {
return new type(item);
}
现在唯一的问题是找出类型参数的来源;您可能还需要将其传递给 item()
方法,以便编译器知道生成 Observable<T>
的类型.
关于angular - 如何在 typescript 的泛型类中创建一个类型为 'T' 的新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45010886/
我是一名优秀的程序员,十分优秀!