جاوااسکریپت - تست موچا: نمیتوان از دستور import خارج از یک ماژول استفاده کرد


من مطمئن نیستم که این یک تنظیمات TS است یا چیزی که نیاز به تنظیم دارد یا چیز دیگری است. من قبلاً این را بررسی کردهام، اما به من کمکی نکرد: Mocha + TypeScript: Cannot use import statement outside a module و این پستها درباره استفاده از <script src="file1.js" type="module"></script> بیمعنی است، من در اینجا در حال اجرای تستها هستم.

من تست خود را با mocha -r ts-node/register src/test/**/*.spec.tsx -r src/test/compiler.ts --color -w اجرا میکنم

و من یک خطا برای import { MemoryRouter as Router } from "react-router-dom"; دریافت میکنم:

Cannot use import statement outside a module

featured.company.group.tsx

import { MemoryRouter as Router } from "react-router-dom";
import { expect, mount, React } from "../../test.imports";
import { FeaturedCompanyGroup, FormattedFeaturedCompany } from "../../../client/Company/FeaturedCompanies";

describe("Featured Company Group", () => {
    const country: Country = {
        id: 0,
        name: "string",
        images: {
            flag: "string"
        }
    };
...

من استفاده میکنم:

"node": "14.x"
"react-router": "^4.3.1",
"react-router-dom": "^4.3.1",
"@types/mocha": "^8.0.0",
"@types/mocha": "^8.0.0",

من یک ریشه ./tsconfig.json دارم:

{
  "compilerOptions": {
    /* Visit https://aka.ms/tsconfig.json to read more about this file */
        "outDir": "./build",
    "target": "ES2020",                     /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
    "module": "es2020",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
    "lib": ["es5", "es6", "dom"],                      /* Specify library files to be included in the compilation. */
        "moduleResolution": "node",
        "allowJs": false,                     /* Allow javascript files to be compiled. */
//      "checkJs": true,                     /* Report errors in .js files. */
    "jsx": "react",
    "noImplicitAny": false,
        "sourceMap": false,                   /* Generates corresponding '.map' file. */
    "rootDir": "./",                     /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
        "removeComments": true,              /* Do not emit comments to output. */
    "strict": true,                      /* Enable all strict type-checking options. */
        "noUnusedLocals": true,                /* Report errors on unused locals. */
        "noUnusedParameters": true,            /* Report errors on unused parameters. */
//    "rootDirs": ["."],                        /* List of root folders whose combined content represents the structure of the project at runtime. */
    "typeRoots": [
      "node_modules/@types"
    ],                      /* List of folders to include type definitions from. */
        "esModuleInterop": true,
        "allowSyntheticDefaultImports": true,  /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
        "preserveSymlinks": true,              /* Do not resolve the real path of symlinks. */
        "resolveJsonModule": true,
        "skipLibCheck": true,                     /* Skip type checking of declaration files. */
    "forceConsistentCasingInFileNames": true,
//      "strictNullChecks": true
    },
    "include": [
        "src"
    ],
    "exclude": [
        "/node_modules",
        "/src/server",
        "/src/client/js/ink-config.js",
        "**/test",
        "dist"
  ]
}

و من یک /src/test/tsconfig.json دارم. (فکر نمیکنم این بهطور واقعی ریشه من را توسعه دهد به دلایلی، به نظر نمیرسد که این tsconfig را تحت تأثیر قرار دهد):

{
    "extends": "../../tsconfig.json",
    "compilerOptions": {
        "noEmit": true,
        "module": "es2020",
        "target": "es2020",
        "types": ["node","mocha", "chai", "react"],
        "lib": ["es6"],
        "compileOnSave": false,
        "jsx": "react",
        "sourceMap": false,
        "skipLibCheck": true,
        "esModuleInterop": true
    },
    "include": ["./**/*spec.tsx"],
    "exclude": ["node_modules","./build"]
}

پاسخ شماره ۱

به نظر میرسد شما از حالت «watch» استفاده میکنید، که طبق مستندات ts-node نیاز به گزینه extensions دارد.