javascript - Tuntematon tiedostopääte ".ts" virhe ilmestyy yrittäessä suorittaa ts-node-skriptiä


Yritän suorittaa skriptiä, joka on luotu tavalliseen kansioon, jossa on kaksi .ts-tiedostoa. Yksi sisältää skriptin ja toinen apufunktioita sen suorittamiseen. Tuon myös muita asioita, kuten axiosia tai form-dataa.

Asia on se, että kun yritän suorittaa skriptin ts-nodella: node script.ts, seuraava virhe ilmestyy:

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"

Minun package.json-tiedostoni:

{
  "dependencies": {
    "@types/node": "^17.0.23",
    "axios": "^0.26.1",
    "form-data": "^4.0.0",
    "showdown": "^2.0.3",
    "ts-node": "^10.7.0",
    "typescript": "^4.6.3"
  },
  "type": "module"
}

Ja minun tsconfig.json-tiedostoni:

{
  "compilerOptions": {
    "esModuleInterop": true
  },
  "include": ["/**/*.ts"],
  "exclude": ["node_modules"]
}

Tuontini script.ts-tiedostossa ovat:

import { datoManagementPrimaryEnvironment } from "./content.management";
import {
  createContent,
  uploadToCloudfare,
  getEntryFromDatoWithTheId,
  getFilters,
} from "./helpers";

ja tiedostossa helpers.ts:

import { datoManagementPrimaryEnvironment } from "./content.management";
import axios from "axios";
import FormData from "form-data";
var showdown = require("showdown");

Tietääkö kukaan, mitä teen väärin? Kiitos!

Vastaus #1

Käytä --esm-kytkintä ts-nodea varten.

Esim.

ts-node --esm index.ts

Tämä vaatii, että sinulla on moduuli asetettuna yhteen uudemmista (kuten nodenext tai node16) ja moduleResolution asetettuna myös uudempaan menetelmään tsconfigissasi.

Vastaus #2

Tämä toimi minulle. Kiitos @Slava, että ohjasit minut oikeaan suuntaan.

Liitän dokumentaation tähän.

Helpoin tapa on lisätä esm: true TypeScriptin konfiguraatiotiedostoosi:

{   
  "$schema": "https://json.schemastore.org/tsconfig",  
  "extends": "@tsconfig/node-lts-strictest-esm/tsconfig.json",  
  "compilerOptions": {
    // …   
  },   
  "include": [
    // …   
  ],   
  "ts-node": {
    "esm": true, // «———— enabling ESM for ts-node   
  }, 
} 

Ainoa asia, joka puuttui, oli "esm": true, lisääminen, koska minulla on jo ts-konfiguraatio asetettu esm:lle. Mutta jos sinulla ei ole mitään, on luultavasti hyödyllistä lisätä "$schema" ja "extends".

Minun piti myös lisätä "type": "module" package.json-tiedostoon.

Vastaus #3

Poista "type": "module" package.json-tiedostostasi

Ja muuta tsconfig.json-tiedostosi seuraavasti:

{
  "compilerOptions": {
    "esModuleInterop": true,
    "moduleResolution": "node"
  },
  "include": ["/**/*.ts"],
  "exclude": ["node_modules"]
}

Aiheeseen liittyviä artikkeleita