javascript - Eroare de extensie necunoscută a fișierului ".ts" apare atunci când încercați să rulați un script ts-node


Încerc să rulez un script creat într-un folder obișnuit cu două fișiere .ts. Unul cu scriptul și unul cu funcții auxiliare pentru a-l rula. De asemenea, import mai multe lucruri, cum ar fi axios sau form-data.

Problema este că atunci când încerc să rulez scriptul cu ts-node: node script.ts, apare următoarea eroare:

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

Fișierul meu package.json:

{
  "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"
}

Și tsconfig.json-ul meu:

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

Importurile mele din fișierul script.ts sunt:

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

și în helpers.ts:

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

Știe cineva ce greșesc? Mulțumesc!

Răspuns #1

Folosește comutatorul --esm pentru ts-node.

Ex

ts-node --esm index.ts

Acest lucru necesită să aveți modulul setat la unul dintre cele mai noi (cum ar fi nodenext sau node16) și moduleResolution, de asemenea, setat la o metodă mai nouă, în tsconfig-ul dumneavoastră.

Răspunsul #2

Acesta este ceea ce a funcționat pentru mine. Mulțumesc lui @Slava pentru că m-a îndreptat în direcția corectă.

Legând documentația aici.

Cea mai simplă metodă este să adaugi esm: true în fișierul tău de configurare TypeScript:

{   
  "$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   
  }, 
} 

Singurul lucru care îmi lipsea era să adaug "esm": true, pentru că deja am configurat ts-config pentru esm. Dar dacă nu ai nimic, probabil că este util să adaugi "$schema" și "extends".

De asemenea, a trebuit să adaug "type": "module" în fișierul package.json.

Răspunsul #3

Eliminați "type": "module" din package.json

Și schimbă fișierul tău tsconfig.json în:

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