Чтобы делегировать настройку локальной переменной, вам нужно будет либо передать какой-то обратный вызов (так же, как вы это делаете в своем subscribe
), либо имя свойства, которое вы хотите обновить.
Вы действительно не экономите много сил, делая его обобщенным c, если только нет некоторого количества повторного кода, которого нет в вашем примере.
Если вы действительно хотел написать обобщенную c функцию, вы могли бы взять эти подходы в качестве отправной точки:
Обратный вызов
Тип возвращаемого объекта из наблюдаемого является обобщенным c. Тэ обратный вызов принимает один аргумент того же типа.
loadData<T>(serviceMethod: Observable<T>, action: (value: T) => void) {
serviceMethod.subscribe((res: T) => action(res));
}
Который вы бы вызывали так:
this.loadData(this.myServiceOne.getDataOne(), res => this.variableOne = res);
Имя свойства
TKey
должен быть именованным ключом в AppComponent
.
TValue
- это тип этого именованного ключа и тип объекта, возвращаемого из наблюдаемого.
loadData2<TKey extends keyof AppComponent, TValue extends AppComponent[TKey]>(
serviceMethod: Observable<TValue>,
key: TKey
): void {
const component: AppComponent = this;
serviceMethod.subscribe((res: TValue) => {
component[key] = res;
});
}
Какой Вы бы вызвали это так:
this.loadData(this.myServiceOne.getDataOne(), 'variableOne');
Имя свойства (полностью обобщенное c)
T
- это тип компонента.
TKey
должен быть именованным ключом в T
.
TValue
- это тип этого именованного ключа и тип объекта, возвращаемого из наблюдаемой.
loadData2<T, TKey extends keyof T, TValue extends T[TKey]>(
component: T,
serviceMethod: Observable<TValue>,
key: TKey
): void {
serviceMethod.subscribe((res: TValue) => {
component[key] = res;
});
}
Который вы бы вызвали так:
this.loadData(this, this.myServiceOne.getDataOne(), 'variableOne');
Обещания
Вы также можете преобразовать наблюдаемое в обещание и использовать asyn c / await, но я действительно не вижу смысла в этом.
DEMO: https://stackblitz.com/edit/angular-btfqng