Ошибка при экспорте функции, возвращающей класс: Экспортированная переменная имеет или использует личное имя

Я получаю сообщение об ошибке

ошибка TS4025: экспортированная переменная 'UserApiClientModule' имеет или использует личное имя 'UserApiClient'.

в следующем коде:

export var UserApiClientModule = {
  fromConfiguration: (configuration: Configuration) => {
    @NgModule({
      providers: [
        {
          provide: BASE_PATH,
          useValue: basePath
        },
        {
          provide: Configuration,
          useValue: configuration
        },
        RegistrationApi,
        AuthApi,
        AccountApi,
        ContactsApi,
        ContactOrgsApi
      ],
      imports: [
        CommonModule,
        HttpModule
      ]
    })
    class UserApiClient { }

    return UserApiClient;
  }
}

Я подозреваю, что решение заключается в том, чтобы каким-то образом экспортировать тип UserApiClient, но я не уверен, как это сделать, поскольку он объявлен в функции.

Ответ 1

Пункт здесь:

Typescript пытается угадать, что такое возвращенный тип всех общедоступных частей. И не только догадаться, но и действительно объявить UserApiClient как часть возвращаемого типа вызова fromConfiguration

И поскольку мы возвращаем что-то, что не экспортируется, является внутренним.. есть проблема. Но мы можем легко вернуть что-то еще, например. некоторый общий интерфейс... или по крайней мере магический any

// change this
export var UserApiClientModule = {
  fromConfiguration: (configuration: Configuration) => {
    @NgModule({
    ...


// to that
export var UserApiClientModule = {                // below is the change
  fromConfiguration: (configuration: Configuration) : any => {
    @NgModule({
    ...

Я бы предпочел объявить некоторый общий интерфейс IHaveDynamicData... как на самом деле в аналогичном случае, показанном здесь Как я могу использовать/создавать динамический шаблон для компиляции динамического компонента с помощью Angular 2.0?

Ответ 2

Я не знаком с Angular 2. Я отвечаю вам из TypeScript:

Проблема проста: вы пытаетесь вернуть частный класс из функции. Это просто неправильный способ сделать это. Это не правильный способ объявить и экспортировать модули и классы.

Каждый файл является модулем, вам не нужно его явно указывать. Не указывайте имена постфиксных переменных с помощью "Module", поскольку переменные не являются модулями.

Используйте ключевое слово export перед определением класса и вытащите его из любой функции. Класс должен быть расположен непосредственно на модуле (файле).

export fromConfiguration: (configuration: Configuration) => {
    @NgModule({
      providers: [
        {
          provide: BASE_PATH,
          useValue: basePath
        },
        {
          provide: Configuration,
          useValue: configuration
        },
        RegistrationApi,
        AuthApi,
        AccountApi,
        ContactsApi,
        ContactOrgsApi
      ],
      imports: [
        CommonModule,
        HttpModule
      ]
    })
  }

export class UserApiClient { }