javascript - Import-satsen fungerar inte i typescript


Jag läste om import- och exportdeklarationer i JavaScript. Sedan försöker jag importera en klass i en fil med hjälp av 'import'-nyckelordet. Men trots att jag har läst om deklarationen av moduler i Node.js får jag ett fel när jag kör node.

Min index.ts :

import Server from "./classes/server";
import router from './routes/router';

const server = new Server();

server.app.use('/', router);

server.start(() => {
    console.log("server starting!");
})

Mina klasser/server.ts

import { SERVER_PORT } from './../global/enviroment';
import express from 'express';

class Server {
    public app: express.Application;
    public port: number;

    constructor(){
        this.app = express();
        this.port = SERVER_PORT;
    }

    start(callback: any){
        this.app.listen(this.port, callback);
    }
}
export default Server;

Min package.json

Men när jag försöker köra npm run start...

Svar #1

Hur är din tsconfig.json?

Jag antar att du saknar någon konfiguration som gör det möjligt att kompilera TypeScript-filen till en kompatibel JavaScript som Node kan köra, här är ett exempel på tsconfig.json som bör fungera

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "preserveConstEnums": true,
    "strict": true,
    "target": "es2017",
}

Så i princip behöver du ha moduleResolution inställt på node https://www.typescriptlang.org/docs/handbook/module-resolution.html

Glöm inte heller att node inte kör ts-filer, du måste först kompilera dem med tsc. Eller om du föredrar kan du alltid köra npx ts-node index.ts

REDIGERA:

ts-node vad det gör är att först kompilera din kod från ts till js och köra den i Node med den genererade js, du kan kolla mer information om ts-node https://github.com/TypeStrong/ts-node.

Om du vill undvika att använda ts-node kan du alltid först kompilera med npx tsc som är kompilatorn från TypeScript. När du har JavaScript kan du köra node index.js eller helt enkelt node .. Observera att du måste kontrollera var din utmatningsmapp för js-filen är genom att använda outDir i ts-konfigurationen. Om outDir-konfigurationen saknas kommer js-filerna att läggas på samma plats som ts-filen finns https://www.typescriptlang.org/docs/handbook/compiler-options.html

Svar #2

Om du vill använda import/export-syntax har du följande alternativ:

  • använd Nodes inbyggda experimentella ES-moduler
  • Använd esm npm-paketet
  • Transpilera till commonjs med hjälp av Babel eller liknande verktyg.

Använder nodes inbyggda ES-moduler:

Lägg till detta i din package.json:

{
  "type": "module"
}

Och ändra ditt startskript till: "start": "node index.js" (förutsätter att du använder node > v13.3.0). Om du använder node v12 eller högre kan du prova: node --experimental-modules index.js

Använd esm-paketet:

Dokumentation här: https://github.com/standard-things/esm

Du behöver dock först kompilera dina .ts-filer till .js-filer. Se TypeScript-dokumentationen för hur man gör det.

Relaterade artiklar