问题描述
this.http.get() 在类型推断中喊错
error TS2322: Type 'Observable<ArrayBuffer>' is not assignable to type 'Observable<IInfo[]>'.
Type 'ArrayBuffer' is missing the following properties from type 'IInfo[]': length, pop, push, concat, and 27 more.
下面是代码:
// type declaration
export interface IQueryParams {
startTime: number;
endTime: number;
orderType: string;
}
export interface IInfo {
name: string;
}
// inside the service
getInfo(queryDataParams: IQueryParams): Observable<IInfo[]> {
return this.http.get<IInfo[]>(`xxx.com`, {
params: queryDataParams
});
}
分析
我发现这是参数的类型问题。在 Angular 的声明中,params 对象需要是HttpParams | {[param: string]: string | string[]}
,但我发送给它一个{[param: string]: number}
也许打字稿找不到最好的声明,所以它使用第一个
解决
我可以通过将参数 obj 解析为 HttpParams 类型 obj 或将参数设置为任何来解决问题,两者都有效
// tool function
function generateHttpParams(params: Object): HttpParams; // parse obj to HttpParams
// parse to HttpParams
getInfo(queryDataParams: IQueryParams): Observable<IInfo[]> {
return this.http.get<IInfo[]>(`xxx.com`, {
params: generateHttpParams(queryDataParams)
});
}
// set as any
getInfo(queryDataParams: IQueryParams): Observable<IInfo[]> {
return this.http.get<IInfo[]>(`xxx.com`, {
params: queryDataParams as any
});
}
但我认为也许在 get 类型声明中{[param: string]: string | string[]}
变成更合适{[param: string]: any}