2016-09-06 2 views
3

Я понимаю, что это несколько неясное, но, возможно, кто-то еще столкнулся с этим или хорошо знает компилятор. Я обрабатываю машинопись файлы с помощью компилятора API машинопись, основанный на примерах, как это: https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-APIКак вы используете Typechecker компилятора Typcript для получения объявленного (псевдонима) типа, а не разрешенного типа?

Представьте меня объявленную функцию, как это в машинописном:

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. Есть ли простой способ поиска объявленного типа параметра, а не его разрешенного типа?

ответ

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-типа-инфо ts-simple-ast, что я работаю на в случае, если у вас нет Не видел.

+0

Wow David! Какой отличный ответ. Очень признателен. И ваша библиотека выглядит великолепно. Время, чтобы вырваться из моего доморощенного решения, чтобы сделать все это. :) – Taytay

Смежные вопросы