使用覆盖的全局接口运行 mocha 测试时出现 tsconfig.json 编译问题

Har*_*ert 5 testing mocha.js node.js typescript tsconfig

我正在尝试为我的 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
  }
}
Run Code Online (Sandbox Code Playgroud)

在我中,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;
  }),
);
}
Run Code Online (Sandbox Code Playgroud)

现在,当我运行时,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'.
Run Code Online (Sandbox Code Playgroud)

我的设置看起来像这样: + 我在每个要测试的文件旁边都有所有测试文件 + 我有一个测试文件夹,我的mocha.opts文件在其中

这是我的mocha.opts文件的内容:

src/**/*.spec.ts
--require ts-node/register
--recursive
Run Code Online (Sandbox Code Playgroud)

最后这是我的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"]
}
Run Code Online (Sandbox Code Playgroud)

期待

像运行服务器一样运行我的测试,而不会出现编译问题。

我感谢每一个帮助。

编辑

我可以通过typings.d.ts在我的app.ts文件中像这样导入类型来解决我的问题

import * as typings from './typings';
Run Code Online (Sandbox Code Playgroud)

但对我来说,这似乎不是解决这个问题的好方法,因为在每个文件中,我都会使用global变量,我需要重新导入上面的类型。

如果你知道如何解决这个问题,仍然可以随意解决。

Chi*_*ani 0

TypeScript 包含以下typeRoots 和类型配置tsconfig.json

"typeRoots": [
    "./node_modules/@types",
    "./typings"
],
"types": [
   "mocha"
]
Run Code Online (Sandbox Code Playgroud)

如果指定了 typeRoots,则仅包含 typeRoots 下的包 typeRoots:在这些文件夹中查找类型。

如果指定了类型,则仅包含列出的包。例如摩卡。如果您需要 typeRoots 中的所有包(如您的情况),则不要提供类型选项。指定"types": []将禁用 @types 包的自动包含。