不小心 运行 直接使用 `node` 而不使用 `ts-node` 的 TypeScript 代码,为什么它可以工作?

Accidentally running TypeScript code directly with `node` without `ts-node`, why does it work?

我已经使用 TypeScript 建立了一个非常简单的 node.js 项目。我的package.json,从里面可以看到我安装了哪些包(没有ts-node),看起来是这样的:

{
  "name": "mydemo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "lint": "eslint . --fix",
    "test": "echo \"Error: no test specified\" && exit 1",
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/node-fetch": "^2.6.1",
    "@typescript-eslint/eslint-plugin": "^5.23.0",
    "@typescript-eslint/parser": "^5.23.0",
    "eslint": "^8.15.0",
    "node-fetch": "^3.2.4",
    "ts-node": "^10.7.0",
    "typescript": "^4.6.4"
  }
}

项目结构:

src/main.ts:

const sayHi = () => {
    console.log('HI!12345');
}

sayHi();

我的tsconfig.json:

{
    "compilerOptions": {
        "target": "es2016",
        "module": "commonjs",
        "outDir": "dist",
        "sourceMap":true,
        "esModuleInterop": true, 
        "forceConsistentCasingInFileNames": true,
        "strict": true,
        "skipLibCheck": true 
    }
}

通过以上设置,我可以在终端上运行 node src/main.ts。每当我在 main.ts 中更新代码时,我直接 运行 node src/main.ts 也显示最新代码的结果。

我本可以安装 ts-node,我试过了,效果也不错。但我想知道为什么没有 ts-node 我的设置工作得很好。我的意思是我已经可以通过 node 命令 运行 TypeScript 代码而无需编译为 运行 JS.

有人可以给我解释一下吗?似乎根本不需要 ts-node

TypeScript 语法是 JavaScript 的超集。您的代码不使用任何 TypeScript 特定语法(如类型声明或类型注释),因此它也是一个有效的 JS 文件,普通 node 可以执行。如果你添加一些类型注释,你会得到一个错误 node:

const sayHi = (n: number) => {
    console.log('HI!12345');
}

sayHi(123);