2016-09-06 1 views
3

Je me rends compte que c'est quelque peu obscur, mais peut-être que quelqu'un d'autre a rencontré cela ou connaît bien le compilateur Typescript. Je traitement des fichiers Tapuscrit en utilisant l'API du compilateur de Tapuscrit, à partir d'exemples comme celui-ci: https://github.com/Microsoft/TypeScript/wiki/Using-the-Compiler-APIComment utilisez-vous Typechecker du compilateur Typescript pour obtenir le type déclaré (alias), plutôt que le type résolu?

Imaginez que j'ai une fonction déclarée comme ceci dactylographiée:

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

Dans les exemples liés ci-dessus, vous pouvez voir des méthodes telles que cette définition pour extraire des informations sur les symboles:

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

Lorsque vous exécutez checker.typeToString(checker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration) sur le symbole date: DateString, au lieu de retourner DateString, elle retourne string. En d'autres termes, vous n'obtenez pas l'alias de type déclaré, mais le type entièrement résolu. Dans mon cas, je voudrais savoir que le type du champ date est DateString. Existe-t-il un moyen facile de rechercher le type déclaré d'un paramètre plutôt que son type résolu?

Répondre

3

Qu'est-ce qui fonctionne pour obtenir le texte du typeNode. Donc, fondamentalement, il faut travailler avec des nœuds au lieu de symboles et de types. Voici un exemple que vous pouvez appliquer à votre scénario:

// 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 

Par ailleurs, vous pouvez consulter cette bibliothèque ts type-info ts-simple-ast que je travaille dans le cas où vous havre de paix Je ne l'ai pas vu.

+0

Wow David! Quelle bonne réponse. Très appréciée. Et votre bibliothèque est superbe. Il est temps d'arracher ma solution maison pour faire tout ça. :) – Taytay