Typescript:通过ESM编程启用TS



我想用Node.js建立项目&打印稿,ts-node,编译成ESM模块

NPM中的一些库在其最新版本中需要ESM。这就是为什么我需要把Typescript代码编译成使用ESM而不是CommonJS的Javascript代码。

但是当我运行index.js时,我仍然得到错误:

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

代码如下:

index.js

import TsNode           from "ts-node";
//
const tsNodeService = TsNode.register({
transpileOnly: false
});
TsNode.createEsmHooks(tsNodeService); //tried with & without that line
//
(async () => {    
const SomeClass = await import("./SomeClass.ts");
console.log(new SomeClass().method("abc", 123));
})();
// alternatively tried also:
/*
import SomeClass from "./SomeClass.ts";
console.log(new SomeClass().method("abc", 123));
*/

SomeClass.ts

export default class SomeClass {
method(a: string, b: number) {
return `${a} and ${b}`;
}
}

tsconfig.json

{
"$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": {
"baseUrl":  "./",
"outDir":   "./output/",
"module":   "Node16",
"target":   "ES2022",
"strict":                       true,
"strictPropertyInitialization": false,
"esModuleInterop":              true,
"noImplicitAny":                true,
"removeComments":               true,
"preserveConstEnums":           true,
"sourceMap":                    true,
"pretty":                       true,
"experimentalDecorators":       true,
"allowJs":                      true,
"resolveJsonModule":            true
},
"exclude": [
"node_modules/**/*"
]
}

package.json

{
"name": "testesmts",
"version": "1.0.0",
"description": "",
"main": "index.js",
"author": "",
"type": "module",
"license": "ISC",
"dependencies": {
"ts-node": "^10.9.1",
"typescript": "^4.9.3"
}
}

我也遇到过类似的问题。但是我用ts-import解决了。

https://www.npmjs.com/package/ts-import

另一个解决方案在代码下面。这个代码更简单。TsNode.register()允许导入ts文件。

#!/usr/bin/env node
const TsNode = require('ts-node')
const path = require('path')
const tsNodeService = TsNode.register({
transpileOnly: false
});
TsNode.createEsmHooks(tsNodeService);
(async () => {
require(path.resolve(__dirname, 'src/index.ts'));

})();

最新更新