gpt4 book ai didi

javascript - Node读取ts模块/读取代码文件

转载 作者:太空宇宙 更新时间:2023-11-04 02:02:39 35 4
gpt4 key购买 nike

如何从文件中读取类?

.src/my-a.service.ts

export class MyAService {
...
}

.src/my-b.service.ts

export class MyBService {
...
}

./read-modules.js

const fs = require('fs');
const _ = require('lodash');

let files = fs.readdirSync('./src')
.filter(item => {
return _.includes(item, '.service.ts')
});


files.forEach(item => {
// get ['MyAService', 'MyBService']
});

我知道你可以做一些字符串解析,但是有没有一种高级方法可以从文件中读取 js/ts 导出(不导入代码,而只是获取导出类的名称)。

编辑1:有 X 个 *.service.ts 文件 my-a.service.tsmy-b.service.ts 只是示例。我并不是试图导入或要求这些类在代码中使用它们,只是获取用于代码生成的类名称。

编辑2:我看起来 tsreflect-compiler 就是我所需要的:

const fs = require('fs');
const _ = require('lodash');
const compiler = require('tsreflect-compiler');

let files = fs.readdirSync('./src')
.filter(item => {
return _.includes(item, '.service.ts')
});


let mods = new Map();
files.forEach(item => {
let diag = compiler.compile(
[`./src/${item}`],
{
noLib: false,
suppressImplicitAnyIndexErrors: true,
noImplicitAny: false,
module: 'ES2015',
moduleResolution: 'Node',
target: 'ES5'
},
{
readFile: (filename, onError) => {
let text;
try {
text = fs.readFileSync(filename, 'utf8');
} catch (error) {
if (onError) {
onError(e.message);
}
text = '';
}
return text;
},
writeFile: (fileName, data, writeByteOrderMark, onError) => {
mods.set(item, JSON.parse(data).declares.map(d => d.name));
}
}
);
});

mods.forEach((value, key) => {
console.log(key); // my-a.service.ts
console.dir(value); // [ 'MyAService' ]
});

但是 tsreflect-compiler 仅使用 TypeScript 1.4 编译器,我需要 2.x 更新版本。有更现代的解决方案吗?

最佳答案

这最终成为我的解决方案:

const fs = require('fs');
const _ = require('lodash');
const ts = require('typescript');

let files = fs.readdirSync('./src')
.filter(item => _.includes(item, '.service.ts'));

let mods = new Map();
files.forEach(file => {
let ex = [];
// https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API#using-the-type-checker
// Build a program using the set of root file names in fileNames
let program = ts.createProgram(
[`./src/${file}`],
{
module: ts.ModuleKind.ES2015,
moduleResolution: ts.ModuleResolutionKind.NodeJs,
target: ts.ScriptTarget.ES5
}
);
// Get the checker, we will use it to find more about classes
let checker = program.getTypeChecker();
// Visit every sourceFile in the program
program.getSourceFiles()
.filter(sourceFile => _.includes(sourceFile.fileName, file))
.forEach(sourceFile => {
// Walk the tree to search for classes
ts.forEachChild(sourceFile, node => {
if (node.kind === ts.SyntaxKind.ClassDeclaration) {
// This is a top level class, get its symbol
let symbol = checker.getSymbolAtLocation(node.name);
ex.push(symbol.getName());
}
});
});
mods.set(file, ex);
});

mods.forEach((value, key) => {
console.log(key); // my-a.service.ts
console.dir(value); // [ 'MyAService' ]
});

关于javascript - Node读取ts模块/读取代码文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45442865/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com