你如何使用Typescript编译器的Typechecker获取声明的(别名)类型,而不是解析类型?

时间:2016-09-06 20:07:46

标签: typescript typescript-compiler-api

我意识到这有点模糊,但也许其他人遇到过这个或者很好地了解Typescript编译器。我正在使用Typescript的编译器API处理Typescript文件,基于这样的示例:https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-API

想象一下,我在Typescript中有一个这样的声明函数:

export type DateString = string;
export function parseDate(date: DateString): Date{
    let parsedDate = Date.parse(date);
    let retVal = new Date();
    retVal.setTime(parsedDate);
    return retVal;
}

在上面链接的示例中,您可以看到这样定义的方法,以提取有关符号的信息:

function serializeSymbol(symbol: ts.Symbol): DocEntry {
    return {
        name: symbol.getName(),
        type: checker.typeToString(checker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration))
    };
}

当您在checker.typeToString(checker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration)符号上运行date: DateString时,它会返回DateString,而不是返回string。换句话说,您没有获得声明的类型别名,而是完全解析的类型。就我而言,我想知道date字段的类型是DateString。是否有一种简单的方法可以查找参数的声明类型而不是其已解析的类型?

1 个答案:

答案 0 :(得分:3)

什么是有效的,以获取typeNode的文本。所以基本上坚持使用节点而不是符号和类型。这是一个可以应用于您的场景的工作示例:

// fileToAnalyze.ts
type DateString = string;
function myFunction(date: DateString) {
}

// main.ts
import * as ts from "typescript";
import * as path from "path";

const program = ts.createProgram([path.join(__dirname, "fileToAnalyze.ts")], { });
const file = program.getSourceFiles().filter(f => /fileToAnalyze/.test(f.fileName))[0];

const funcNode = (file.statements[1] as ts.FunctionDeclaration);
const parameterNode = funcNode.parameters[0];
console.log(parameterNode.type.getText()); // DateString

顺便说一下,你可能想看看我一直在努力的这个库 ts-type-in​​fo ts-simple-ast,以防你没有看到它。