Вы должны исходить из возможностей фреймворка, а фреймворк не предлагает ничего подобного. Если может быть более одного вида GridApiService <T> для одного инжектора, вам придется либо создать его подкласс, либо внедрить фабричную функцию или класс-оболочку, для которого создается аргумент T. Это потенциальная проблема XY, и предпочтительное решение может отличаться от того, что вы пытаетесь сделать. И AOT тоже наложит некоторые ограничения.

я есть декорированный модельный класс:

@Api('payments/deposit')
export class DepositsModel {
  public id: number;
  public created_at: Date;
  ...

В конструкторе угловых компонентов я внедряю сервис данных, указывающий на использование моего класса модели:

...
public constructor( 
  private $api: GridApiService<DepositsModel>
...
) {
  this.service = new GridService($api);
  ...
}
...

Итак, у моего классного компонента есть классный сервис, ведьма знает тип данных, с которыми он работает ...

Должен знать..

Но как я могу получить метаданные моей модели в моем GridApiService? Я пробовал:

@Injectable()
export class GridApiService<T>{
  constructor(
    $http: HttpClient,
  ) {
    let api = Reflect.getMetadata('Api', T);
  }

И получилСообщение об ошибке: «T» относится только к типу, но здесь используется в качестве значения.

ОБНОВИТЬ

Можете ли вы посоветовать мне другой способ передачи данных инициализации в мой GridApiService, который должен вводиться через DI, а не создаваться с новым ключевым словом?

Ответы на вопрос(1)

за исключением тех, которые могут быть переданы как метаданные через декораторы классов. Общие типыне может быть испущено и не существует для Angular DI.GridApiService<DepositsModel> не имеет значения ни для чего, кроме проверки типов.

Связь междуGridApiService иDepositsModel должен быть выражен с дизайном класса, например наследование:

class DepositsGridApiService extends GridApiService {
  Model = DepositsModel;
}
 Anton Pegov08 нояб. 2017 г., 08:13
Да, но я искал способ не создавать целый ряд услуг, а иметь универсальный ...
 estus08 нояб. 2017 г., 09:53
Вы должны исходить из возможностей фреймворка, а фреймворк не предлагает ничего подобного. Если может быть более одного вида GridApiService <T> для одного инжектора, вам придется либо создать его подкласс, либо внедрить фабричную функцию или класс-оболочку, для которого создается аргумент T. Это потенциальная проблема XY, и предпочтительное решение может отличаться от того, что вы пытаетесь сделать. И AOT тоже наложит некоторые ограничения.

Ваш ответ на вопрос