node.js - Köra mocha med Typescript ger: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Okänd filändelse ".ts"


Jag försöker skriva några tester med Typescript och Mocha.

Följande dess dokumentation slutade jag upp med följande uppsättning:

package.json

{
//...
  "scripts": {
    "test": "mocha",
  },
//...
}

.mocharc.json

{
  "extension": ["test.ts"],
  "spec": "tests/*.test.ts",
  "require": "ts-node/register",
  "recursive": true
}

tsconfig.json

{
    "compilerOptions": {
        "outDir": "dist",
        "module": "commonjs",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "sourceMap": false,
        "strict": true,
        "esModuleInterop": true,
        "isolatedModules": true,
    },
    "files": [
        "src/main/main.ts",
    ],
}

Att köra npm test ger följande fel: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Okänd filändelse ".ts" för [...]/tests/task.test.ts.

Det är mitt enda test, och det fungerar tills jag importerar en separat .ts-fil (../src/core/task), för fullständighetens skull:

task.test.ts

import { assert } from 'chai';
import { Task } from '../src/core/task';

describe('Task', () => {
    it('Task Run', () => {
        const task = new Task({
            title: "My Title",
            command: "echo hello",
            path: "."
        });
        
        task.run();
    })
});

Jag har försökt flera varianter av min konfiguration enligt några andra svar samt ts-mocha utan framgång.

Svar #1

Jag hade samma problem tidigare, det fungerade i ts-node@9 men inte i ts-node@10 och sedan försökte jag denna konfiguration i .mocharc.json för att få det att fungera som förväntat

{
  "extensions": ["ts"],
  "spec": ["**/*.spec.*"],
  "node-option": [
    "experimental-specifier-resolution=node",
    "loader=ts-node/esm"
  ]
}

Svar #2

I mitt fall orsakades problemet av en import i en JS-fil som importerades av TypeScript-testfiler. Att omvandla det till en require löste problemet.

Allmänt sett, när undantaget inträffar i:

Loader.defaultGetFormat [as _getFormat] internal/modules/esm/get_format.js

Det kan bara finnas en förklaring: Node.js använder sin ESM-laddare för att ladda det som borde vara kod transpilerad av ts-node.

Så lösningen bör alltid vara - hitta anledningen till att Node.js byter till ESM och eliminera den.

Relaterade artiklar