Здесь есть несколько проблем.
Сообщение об ошибке вызвано тем, что вы используете <T[]>
на get
и toPromise
, которые не являются общими функциями,Просто примените тип T
к result
в обработчике then
.
Вы попадаете в антипаттерн создания обещания. У вас уже есть обещание (от this.httpClient
), поэтому вам не нужно new Promise
.
Вы используете традиционную функцию для new Promise
обратный вызов, но затем использование this
внутри него, как если бы оно все еще ссылалось на экземпляр вашего класса. Если вы собираетесь сохранить new Promise
, вам нужно вместо этого использовать функцию стрелки, поэтому она закрывается вместо this
.
Вместо этого (см. ***
комментарии):
protected scroll<T>(path: string, pageSize: number, filter: string, data: T[]): Promise<T[]> {
// *** Return the result of calling `then` on the promise from `toPromise`
return this.httpClient
// *** Don't use <T[]> on `get` and `toPromise`
.get(this.appConfigService.buildApiUrl(path), { params })
.toPromise()
.then((result: T) => { // *** <== Note the `T`
// *** If it's really possible that `result` will be falsy and you don't want that
// to be valid, you can do this:
if (!result) {
throw new Error("appropriate error here");
}
return data.concat(result);
});
}
На детской площадке
ОБНОВЛЕНИЕ:
Я не должен был удалять условие if из примера:
Неважно, просто поместите вышеуказанное тело в блок if
:
protected scroll<T>(path: string, pageSize: number, filter: string, data: T[]): Promise<T[]> {
if (!filter) {
const params = new HttpParams()
.set('searchText', '')
.set('skip', data.length.toString())
.set('take', pageSize.toString());
return this.httpClient
// *** Don't use <T[]> on `get` and `toPromise`
.get(this.appConfigService.buildApiUrl(path), { params })
.toPromise()
.then((result: T) => { // *** <== Note the `T`
// *** If it's really possible that `result` will be falsy and you don't want that
// to be valid, you can do this:
if (!result) {
throw new Error("appropriate error here");
}
return data.concat(result);
});
}
return this.filter<T>(data, pageSize, filter, path);
}