尝试运行 ts-node 脚本时出现未知文件扩展名“.ts”错误

Emi*_*ano 36 javascript typescript ts-node

我正在尝试运行在常规文件夹中创建的带有两个 .ts 文件的脚本。一份包含脚本,一份包含运行脚本的辅助函数。我还导入了更多东西,例如 axios 或表单数据。

问题是,当我尝试使用 ts-node: node script.ts运行脚本时,出现以下错误:

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts"
Run Code Online (Sandbox Code Playgroud)

我的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"
}
Run Code Online (Sandbox Code Playgroud)

还有我的 tsconfig.json:

{
  "compilerOptions": {
    "esModuleInterop": true
  },
  "include": ["/**/*.ts"],
  "exclude": ["node_modules"]
}
Run Code Online (Sandbox Code Playgroud)

我在 script.ts 文件中的导入是:

import { datoManagementPrimaryEnvironment } from "./content.management";
import {
  createContent,
  uploadToCloudfare,
  getEntryFromDatoWithTheId,
  getFilters,
} from "./helpers";
Run Code Online (Sandbox Code Playgroud)

在 helpers.ts 中:

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

有谁知道我做错了什么?谢谢!

Vic*_*r P 24

使用--esmts-node 的开关。

例如

ts-node --esm index.ts
Run Code Online (Sandbox Code Playgroud)

这要求您在 tsconfig.json 中将模块设置为较新的模块之一(例如nodenext或),并且 moduleResolution 也设置为较新的方法。node16

  • @mikemaccana 与模块值相同(例如,nodenext、node16) (2认同)

chr*_*989 12

这对我有用。感谢@Slava 为我指明了正确的方向。

\n

在此处链接文档。

\n
\n

最简单的方法是将 esm: true 添加到您的 TypeScript 配置文件中:

\n
{   \n  "$schema": "https://json.schemastore.org/tsconfig",  \n  "extends": "@tsconfig/node-lts-strictest-esm/tsconfig.json",  \n  "compilerOptions": {\n    // \xe2\x80\xa6   \n  },   \n  "include": [\n    // \xe2\x80\xa6   \n  ],   \n  "ts-node": {\n    "esm": true, // \xc2\xab\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94\xe2\x80\x94 enabling ESM for ts-node   \n  }, \n} \n
Run Code Online (Sandbox Code Playgroud)\n
\n

我唯一缺少的是添加,"esm": true,因为我已经有 esm 的 ts-config 设置。"$schema"但如果您什么都没有,添加和可能会有所帮助"extends"

\n

我还需要添加"type": "module"package.json 文件。

\n


Tho*_* H. 9

"type": "module"从 package.json 中删除

并将您的更改tsconfig.json为:

{
  "compilerOptions": {
    "esModuleInterop": true,
    "moduleResolution": "node"
  },
  "include": ["/**/*.ts"],
  "exclude": ["node_modules"]
}
Run Code Online (Sandbox Code Playgroud)

  • 你好,谢谢你的回答,但我已经尝试过了。然后出现此错误:“SyntaxError:无法在模块外部使用 import 语句” (8认同)
  • 仍然出现相同的错误:“未知文件扩展名“.ts”” (6认同)
  • 当我更改这些时,会出现之前的错误:SyntaxError:无法在模块之外使用 import 语句' (3认同)
  • `tsconfig.json` 中也缺少 `"moduleResolution":"node"` (2认同)
  • 伟大的 !你是怎么解决的?您可以分享您的“script.ts”文件吗? (2认同)

Sla*_* II 5

以下是如何将 TypeScript 与本机 ESM 结合使用

\n
    \n
  1. 更新您的package.json以具有:
  2. \n
\n
{\n  "type": "module",\n  // \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 安装@tsconfig/node-lts-strictest-esm依赖项:
  2. \n
\n
{\n  "type": "module",\n  // \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 更新您的tsconfig.json以具有:
  2. \n
\n
{\n  "$schema": "https://json.schemastore.org/tsconfig",\n  "extends": "@tsconfig/node-lts-strictest-esm/tsconfig.json",\n  // \xe2\x80\xa6\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. .js在 TS 源文件中使用带扩展名的导入,例如:
  2. \n
\n
import { Foo } from \'./common/foo.js\';\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 然后使用ts-node-esm file.ts命令代替ts-node file.ts.
  2. \n
\n

这应该可以解决问题。

\n
\n

另外,请查看详细指南

\n