gpt4 book ai didi

angular - 如何在 typescript 的泛型类中创建一个类型为 'T' 的新对象?

转载 作者:太空狗 更新时间:2023-10-29 17:32:54 24 4
gpt4 key购买 nike

我有以下服务

@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/

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