我正在查看TypeScript Compiler API的一些代码,并且我遇到了一个奇怪的情况,即node_modules
解析的导入仅在定位ES6 / ES2015时才被称为类型。< / p>
设定:
npm install --save typescript
代码查看:
// fileToAnalyze.ts
import * as ts from "typescript";
let myVar: ts.Node;
要运行的代码:
import * as ts from "typescript";
import * as path from "path";
function runWithTarget(name: string, target: ts.ScriptTarget) {
const program = ts.createProgram([path.join(__dirname, "fileToAnalyze.ts")], { target });
const typeChecker = program.getTypeChecker();
const file = program.getSourceFiles().filter(f => /fileToAnalyze/.test(f.fileName))[0];
const statement = (file.statements[1] as ts.VariableStatement);
const node = statement.declarationList.declarations[0];
const type = typeChecker.getTypeAtLocation(node);
console.log(`${name}: ${typeChecker.typeToString(type)}`);
}
runWithTarget("ES5", ts.ScriptTarget.ES5); // outputs Node
runWithTarget("ES6", ts.ScriptTarget.ES6); // outputs any
我可以花几天时间为自己解决这个问题,但我知道一些知识渊博的人可以帮助我尽快找到答案。为什么会发生这种情况?如何在这种情况下获得变量的类型?
答案 0 :(得分:0)
发生这种情况的原因是,在定位ES6时,模块分辨率默认从[[sum([x[1] for x in i])] for i in data]
更改为ts.ModuleResolutionKind.NodeJs
。
这可以通过在编译器选项中指定模块解析ts.ModuleResolutionKind.Classic
来解决。