在 TypeScript 中调用泛型类型的构造函数
Calling constructor of generic type in TypeScript
我有如下一段代码:
public getProducts<T>(): Observable<T[]> {
return this.httpClient
.get<T[]>(this.baseUrl + '/users')
.pipe(
map((entities) => {
return entities.map((entity) => {
return new T(entity);
})
}),
catchError((err) => Observable.throw(err))
);
}
这一行给我一个错误:return new T(entity)
;
如何在 TypeScript 中调用泛型的构造函数?
T
只是一种类型,类型在运行时被擦除,因此类型永远不会出现在表达式中。
您需要做的是传入 T
的构造函数。
public getProducts<T>(ctor: new (p: Partial<T>) => T): Observable<T[]> {
return this.httpClient
.get<T[]>(this.baseUrl + '/users')
.pipe(
map((entities) => {
return entities.map((entity) => {
return new ctor(entity);
})
}),
catchError((err) => Observable.throw(err))
);
}
这意味着您为 T
定义了 class。如果没有 class,那么就不要理会 new T
。如果 T
是一个接口,那么服务器返回的对象大概会满足该接口,不需要做更多的事情/
我有如下一段代码:
public getProducts<T>(): Observable<T[]> {
return this.httpClient
.get<T[]>(this.baseUrl + '/users')
.pipe(
map((entities) => {
return entities.map((entity) => {
return new T(entity);
})
}),
catchError((err) => Observable.throw(err))
);
}
这一行给我一个错误:return new T(entity)
;
如何在 TypeScript 中调用泛型的构造函数?
T
只是一种类型,类型在运行时被擦除,因此类型永远不会出现在表达式中。
您需要做的是传入 T
的构造函数。
public getProducts<T>(ctor: new (p: Partial<T>) => T): Observable<T[]> {
return this.httpClient
.get<T[]>(this.baseUrl + '/users')
.pipe(
map((entities) => {
return entities.map((entity) => {
return new ctor(entity);
})
}),
catchError((err) => Observable.throw(err))
);
}
这意味着您为 T
定义了 class。如果没有 class,那么就不要理会 new T
。如果 T
是一个接口,那么服务器返回的对象大概会满足该接口,不需要做更多的事情/