如何使用TypeScript编译器API对使用`require()`导入的模块进行类型检查



我使用TypeScript编译器API中的TypeChecker来提取(推断(程序AST中每个节点的类型信息。特别是,我试图从导入的模块函数中找出返回值,例如:

var vec3 = require('gl-matrix/vec3')
var myVec = vec3.fromValues(1, 2, 3) // $ExpectedType vec3

这适用于使用import { … } from '…'语句导入的模块,但不幸的是,像上面这样使用require()导入的模块无法正确识别,我只收到它们的类型any。但是,我已经设置了两个编译器选项allowJscheckJs

为什么require()d模块的类型没有得到正确推断VS Code(AFAIK依赖于同一个API?(也能够从require()语句中推断类型,所以我猜一般来说,tsc能够处理它们。是否还有其他编译器选项需要进行不同设置?或者这确实不受支持,我需要使用其他包来实现这一点?

下面是一个需要复制的最小脚本,我还将其与两个示例文件一起放在repl.it上:https://replit.com/@LinqLover/typecheck js

var ts = require("typescript")
// Run `node index.js sample-import.js`` to see the working TypeScript analysis
const files = process.argv[1] != "/run_dir/interp.js" ? process.argv.slice(2) : ["sample-require.js"]
console.log(`Analyzing ${files}:`)
const program = ts.createProgram(files, {
target: ts.ScriptTarget.ES5,
module: ts.ModuleKind.CommonJS,
allowJs: true,
checkJs: true
})
const checker = program.getTypeChecker()
for (const sourceFile of program.getSourceFiles()) {
if (!sourceFile.isDeclarationFile) {
ts.forEachChild(sourceFile, visit)
}
}
function visit(node) {
try {
const type = checker.getTypeAtLocation(node)
console.log(checker.typeToString(type))
} catch (e) {
// EAFP
}
ts.forEachChild(node, visit)
}

提前感谢您!

对于后续操作,这是gl-matrix的类型定义的问题。在怀疑TypeScript引擎本身可能损坏之前,我最好先试用多个包。。。

gl-matrix问题:https://github.com/toji/gl-matrix/issues/429

最新更新