tsconfig.json проблема компиляции при запуске тестов mocha с перезаписанными глобальными интерфейсами - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь написать тесты для моего серверного приложения nodejs, и теперь все работает нормально.Я могу скомпилировать свой код из машинописного текста в javascript без ошибок и всего, но когда я пытаюсь запустить mocha-тесты, предварительная компиляция машинописного текста завершается неудачно из-за того, что я не нахожу свои собственные определяемые типы в typings.d.ts.

Вот мои объявлениявнутри typings.d.ts

import {User} from "./users/user.model";
import {MainDatabase} from "./core/models/database.model";
import {Translation} from "./core/services/i18n";
import {LanguageDefinition} from "./core/models/language.model";
import {Reminder} from "./core/services/schedule/schedule.model";
import {UserProfileModel} from "./core/database/models/user_profile";
import {UserClientModel} from "./core/database/models/user_client";
import {PhoneNumberModel} from "./core/database/models/phone_number";
import {CountryModel} from "./core/database/models/country";
import {CustomerTypeModel} from "./core/database/models/customer/customer_type";
import {CustomerModel} from "./core/database/models/customer/customer";
import {ReminderModel} from "./core/database/models/reminder_options";
import {Customer} from "./customers/customer.model";
import {IUserAccount} from "./core/database/models/user_account";
import {UserAccountModel} from "./core/database/models/user_account";
import {MailModel} from "./core/services/mail/mail.model";
import {Request} from "express";
import {Models} from "sequelize";

declare global {
  module NodeJS {
    interface Global {
      translation: Translation;
      db: MainDatabase;

      /*Classes to be reach through the global object*/
      User: User;
      Reminder: Reminder;
      Customer: Customer;
      Mailer: MailModel;
    }
  }

}

declare module "Express"{
  export interface Request {
    user?: IUserAccount;
    authenticated: boolean;
    locals: {
      files?: File[];
    };
    locale?: LanguageDefinition;
    info?:{
      userAgent?: string;
      ip?: string;
    }
  }
}

// extending the original sequelize interfaces
declare module "sequelize" {

  /**
   * Database models
   * only list SEQUELIZE Models here not classes
   * */
  interface Models {
    UserProfile: UserProfileModel;
    UserAccount: UserAccountModel;
    UserClient: UserClientModel;
    Reminder: ReminderModel;
    PhoneNumber: PhoneNumberModel,
    CustomerType: CustomerTypeModel,
    Customer: CustomerModel,
    Country: CountryModel
  }
}

И в моем app.ts я использую эти типы, импортируя оригинальный интерфейс / тип из исходного пакета

//omitted for brevity
/**
 * Setup all globals that do not belong to the database
 * */
private setupServerGlobals() {
  try {
    global.Mailer = new MailModel();
  } catch (e) {
    console.error('setupServerGlobals', e);
  }
}

private setupTranslation(): Observable<any> {
  // create translation
  const translation = new Translation({
    language: { language: 'de', fullLanguage: 'de' },
  });
return translation.init().pipe(
  tap(() => {
    global.translation = translation;
  }),
);
}

Теперь, когда я запускаюtsc --watch & nodemon ./dist/src/app.js все файлы успешно скомпилированы и сервер запускается без проблем.Мои глобальные определенные типы внутри typings.d.ts видятся компилятором из-за моей конфигурации tsconfig.json.

Но когда я запускаю tsc & mocha, он выдает эту ошибку:

/Users/user/Documents/Project/subfolder/project-name/node_modules/ts-node/src/index.ts:261
    return new TSError(diagnosticText, diagnosticCodes)
           ^
TSError: ⨯ Unable to compile TypeScript:
src/app.ts(60,14): error TS2339: Property 'Mailer' does not exist on type 'Global'.
src/app.ts(78,11): error TS2339: Property 'info' does not exist on type 'Request'.
src/app.ts(156,16): error TS2339: Property 'translation' does not exist on type 'Global'.

Моя настройка выглядитнапример: + У меня есть все тестовые файлы рядом с каждым тестируемым файлом + У меня есть тестовая папка, в которой мой mocha.opts файл находится в

Вот содержимое моего mocha.opts файла:

src/**/*.spec.ts
--require ts-node/register
--recursive

И, наконец, вот мой tsconfig.json файл:

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "allowJs": true,
    "importHelpers": true,
    "jsx": "react",
    "alwaysStrict": true,
    "sourceMap": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "noUnusedLocals": false,
    "noUnusedParameters": false,
    "noImplicitAny": false,
    "noImplicitThis": false,
    "strictNullChecks": false,
    "outDir": "dist"
  },
  "include": ["**/*.ts"]
}

Ожидание

Для запуска моих тестов, как он запускает сервер, без проблем компиляции.

Я ценю любую помощь.

Редактировать

Я мог бы решить мою проблему, просто импортировав набранные из typings.d.ts, как в моем app.ts файле

import * as typings from './typings';

Но для меня это просто не кажется хорошим решением этой проблемы, потому что в каждом файле я буду использовать переменную global, мне нужно будет повторно импортировать ввод, как указано выше.

Тем не менеене стесняйтесь решать эту проблему, если знаете как.

1 Ответ

0 голосов
/ 18 октября 2018

TypeScript содержит ниже typeRoots и типы конфиги в tsconfig.json:

"typeRoots": [
    "./node_modules/@types",
    "./typings"
],
"types": [
   "mocha"
]

Если указан typeRoots, только пакеты в typeRoots будут включены typeRoots: в этих папках просматриваются наборы,

Если указаны типы, будут включены только перечисленные пакеты.например, мокко.Если вам требуются все пакеты из typeRoots (как в вашем случае), не предоставляйте параметры типов.Указание "types": [] отключит автоматическое включение пакетов @types.

...