5

我意识到这有点晦涩难懂,但也许其他人已经遇到过这个问题或者很了解 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. 是否有一种简单的方法来查找参数的声明类型而不是其解析类型?

4

1 回答 1

6

不幸的是,由于“类型实习”,这不起作用。见这里

有效的是获取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(file)); // DateString

顺便说一句,您可能想查看我一直在研究的这个库ts-type- in​​fo ts -simple-ast ts-morph,以防您没有看到它。

于 2016-09-07T00:50:35.310 回答