我需要向一些API发出get请求。为此,我在service
中设置了这个方法export interface IFilterAuctionBids {
filterSupplierName: string;
filterLocation: string;
filterBidPrice: number;
limitResultFlag: boolean;
filterBidAwardStatus: AuctionBidFilterStatus[]
}
getAuctionBidsByGuidUsingGET(auctionGuid: any, params?: IFilterAuctionBids) {
console.log('-', params.filterBidAwardStatus);
return this.http.get(this._GET_AUCTION_URL + '/' + ApiPaths.auction + '/' + auctionGuid + '/bids', {params});
}
从我的组件,我发送所需的查询参数,这是可选的。
let queryParams = {
filterBidAwardStatus: ['Awarded']
}
this.getAuctionService
.getAuctionBidsByGuidUsingGET(this.parametarsURL, queryParams)
.subscribe((data) => {
...
}
所以我想只发送例如filterBidAwardStatus查询参数。
但是在服务中我得到了error
No overload matches this call.
The last overload gave the following error.
Type 'IFilterAuctionBids' is not assignable to type 'HttpParams | { [param: string]: string | string[]; }'.
Type 'IFilterAuctionBids' is not assignable to type '{ [param: string]: string | string[]; }'.
Index signature is missing in type 'IFilterAuctionBids'
为什么?
我需要有类型安全,所以当我发送查询参数时,这些查询参数遵循我的接口签名。
I tried with
getAuctionBidsByGuidUsingGET(params: GetAuctionBidsByGuidUsingGETParams, queryParams?: IFilterAuctionBids): Observable<__model.AuctionBidPojoListBaseResponse> {
const httpParams = new HttpParams();
console.log('queryParams', queryParams);
Object.entries(queryParams).forEach(([key, value]) => httpParams.set(key,value.toString()));
return this.http.get(this._GET_AUCTION_URL + '/' + ApiPaths.auction + '/' + params.auctionGuid + '/bids', {params: httpParams});
}
现在我有了类型安全,但是值没有作为查询参数发送
我认为你得到这个错误是因为你试图传递第二种类型的对象
{[param: string]: string | string[];}
,它期望你只传递字符串和字符串数组,但你的接口有多个其他类型的数字和布尔属性。你可以创建一个新对象其中每个属性类型的值要么是字符串要么是字符串数组也可以像
下面这样getAuctionBidsByGuidUsingGET(auctionGuid: any, params ? : IFilterAuctionBids) {
const httpParams = new HttpParams(); // create
Object.entries(params).forEach(([key, value]) => {
if (Array.isArray(value)) {
httpParams.set(key, value.map(val => v.toString())); // convert array: any[] into string[]
} else {
httpParams.set(key, value.toString());// insert keys
}
});
return this.http.get(this._GET_AUCTION_URL + '/' + ApiPaths.auction + '/' + auctionGuid + '/bids', httpParams);
}
在上面的代码中,我只是循环遍历对象(keys &
IFilterAuctionBids的value),并将它们手动分配给HttpPram对象。