Typescript: передать метод в качестве параметра другого метода - PullRequest
0 голосов
/ 04 марта 2020

В моем приложении angular у меня есть такая обработка:

this.myServiceOne.getDataOne().subscribe((res => {this.variableOne= res}));
this.myServiceTwo.getDataTwo().subscribe((res => {this.variableTwo= res}));
this.myServiceThree.getDataThree().subscribe((res => {this.variableThree= res}));
this.myServiceFour.getDataFour().subscribe((res => {this.variableFour= res}));

Моя цель - сделать функцию c generi следующим образом:

  loadData(myVariable, myserviceMethod){
    serviceMethod().subscribe((res => {pefVar = res}));
  }

и замените мою обработку следующим образом:

this.loadData(this.variableOne, this.myServiceOne.getDataOne);

Но это, кажется, не работает, и это не может понять эту инъекцию: (this.myServiceOne.getDataOne)

Ваши предложения?

1 Ответ

0 голосов
/ 04 марта 2020

Чтобы делегировать настройку локальной переменной, вам нужно будет либо передать какой-то обратный вызов (так же, как вы это делаете в своем 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...