使用TypeScript编译器API获取标识符的类型

juud5qan  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(117)

给定此输入文件:

function foo (s: string) {
  console.log(s)
}

我想通过编程来确定console.log(s)s的类型。换句话说,我想使用VSCode使用的任何机制来告诉我,当我将鼠标悬停在s上时,它是一个字符串。

这是我最接近的一次了

const ts = require("typescript");

const sourceCode = `
function (s: string) {
  console.log(s)
}
`;

const sourceFile = ts.createSourceFile(
  "test.ts",
  sourceCode,
  ts.ScriptTarget.Latest
);

const functionDeclaration = sourceFile.statements[0];

const identifier =
  functionDeclaration.body.statements[0].expression.arguments[0]; // the s in console.log(s)

const typeChecker = ts.createTypeChecker(ts.createProgram(["test.ts"], {}));
const type = typeChecker.getTypeOfSymbolAtLocation(identifier);

console.log(typeChecker.typeToString(type));

我希望输出是“string”,但实际上输出是“any”。

m3eecexj

m3eecexj1#

我不确定如何让问题中的示例代码工作,但我确实找到了我需要的答案。
给定一个类型节点,我可以调用getFlags(),它返回一个位图。然后我可以根据typescript.TypeFlags.Undefined屏蔽该位图,以确定它是否是undefined类型。
如果它是一个联合类型,我需要对typeNode.types中的每个类型进行检查。
重要的代码最终看起来像这样:

const couldBeUndefined = 
    typeNode.getFlags() & typescript.TypeFlags.Undefined || 
    typeNode.types?.some((n) => n.getFlags() & typescript.TypeFlags.Undefined);

这不适用于问题中的示例代码,但它在我需要的地方工作,在ESLint规则中。

相关问题