使用编译器API定位ES6时,来自node_modules的类型未知

时间:2016-06-03 03:01:59

标签: typescript

我正在查看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

我可以花几天时间为自己解决这个问题,但我知道一些知识渊博的人可以帮助我尽快找到答案。为什么会发生这种情况?如何在这种情况下获得变量的类型?

1 个答案:

答案 0 :(得分:0)

发生这种情况的原因是,在定位ES6时,模块分辨率默认从[[sum([x[1] for x in i])] for i in data] 更改为ts.ModuleResolutionKind.NodeJs

这可以通过在编译器选项中指定模块解析ts.ModuleResolutionKind.Classic来解决。