typescript - Okänt filändelsefel efter att ha lagt till 'type: module' i package.json
Jag arbetar i TypeScript och använder moderna import-satser. När jag kör nodemon (som då använder ts-node) resulterar detta uppenbarligen i SyntaxError: Cannot use import statement outside a module. Rimligt nog, så lade jag till "type": "module" i min package.json-fil. Utan att ändra något annat, lyder det nya felet nu: TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" för .../file.ts. Kom ihåg att exakt samma konfiguration - innan jag lade till "type":"module" - körde .ts-filerna utan problem. Nodemon använder fortfarande ts-node korrekt, vilket framgår av raden ovanför felet: [nodemon] starting ts-node src/file.ts
Så jag är förvirrad: Utan att använda "type":"module" och moderna imports fungerar allt precis som det ska. Att lägga till moderna imports ger ett berättigat fel. Att försöka åtgärda det med "type":"module" skapar dock konstigt beteende.
Jag försökte också ta bort allt innehåll från min huvud-.ts-fil och lade bara till en console.log-sats. Utan "type":"module" i min package.json-fil skrivs detta ut i loggen utan problem. Att lägga till "type":"module" igen resulterar omedelbart i felet med okänd filändelse igen.
Enkelt uttryckt:
Det här fungerar bra:
// File.ts
console.log("test")
// package.json
{
...
}
// Output
test
Detta resulterar i ett fel:
// File.ts
console.log("test")
// package.json
{
"type": "module",
...
}
// Output
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for .../file.ts
Jag är säker på att jag gör något fel, men den här typen av fel gör det verkligen inte lätt att lista ut på egen hand. Vet någon vad som kan orsaka detta?
Svar #1
Felet ERR_UNKNOWN_FILE_EXTENSION visas när man använder ts-node i ett ESM-projekt på Node.js 20 eller senare (se här).
Fixa det med Nodes --loader-flagga
Att köra ts-node eller ts-node-esm direkt fungerar inte (se här). Du måste använda ts-node/esm-laddaren med vanlig Node.js:
node --no-warnings=ExperimentalWarning --loader ts-node/esm/transpile-only src/main.ts
Var medveten om att det inte kommer att ge dig korrekta stackspår, så se till att köra tsc i förväg för att få typkontroll:
tsc --noEmit && node --no-warnings=ExperimentalWarning --loader ts-node/esm/transpile-only src/main.ts
I en nodemon.json-fil skulle detta se ut så här:
{
"watch": ["src"],
"ext": "ts",
"execMap": {
"ts": "tsc --noEmit && node --no-warnings=ExperimentalWarning --loader ts-node/esm/transpile-only"
}
}
