MST
星途 面试题库

面试题:TypeScript自定义Transformer中如何获取节点信息

在TypeScript自定义Transformer开发中,阐述一下如何通过相关API获取AST节点的类型、名称等基本信息。假设存在一个简单的函数声明节点,描述获取其函数名和参数列表的步骤。
25.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
  1. 获取AST节点类型信息
    • 在TypeScript自定义Transformer中,可以使用ts.getTypeChecker()方法获取类型检查器typeChecker
    • 对于特定的AST节点(如ts.Node类型的节点),可以通过typeChecker.getTypeAtLocation(node)方法获取该节点的类型信息。例如:
    import * as ts from 'typescript';
    function myTransformer(context: ts.TransformationContext): ts.TransformerFactory<ts.SourceFile> {
        return (sourceFile: ts.SourceFile) => {
            const typeChecker = context.getTypeChecker();
            const visitor = (node: ts.Node): ts.Node => {
                const type = typeChecker.getTypeAtLocation(node);
                // 这里可以对type进行进一步操作,比如获取类型名称等
                return ts.visitEachChild(node, visitor, context);
            };
            return ts.visitNode(sourceFile, visitor);
        };
    }
    
  2. 获取AST节点名称信息
    • 不同类型的节点获取名称的方式不同。对于函数声明节点(ts.FunctionDeclaration),可以直接访问其name属性来获取函数名。例如:
    import * as ts from 'typescript';
    function myTransformer(context: ts.TransformationContext): ts.TransformerFactory<ts.SourceFile> {
        return (sourceFile: ts.SourceFile) => {
            const visitor = (node: ts.Node): ts.Node => {
                if (ts.isFunctionDeclaration(node)) {
                    const functionName = node.name?.text;
                    // 这里获取到了函数名
                }
                return ts.visitEachChild(node, visitor, context);
            };
            return ts.visitNode(sourceFile, visitor);
        };
    }
    
  3. 获取函数声明节点的参数列表
    • 对于函数声明节点(ts.FunctionDeclaration),可以访问其parameters属性来获取参数列表。parameters是一个ts.ParameterDeclaration类型的数组。
    • 示例代码如下:
    import * as ts from 'typescript';
    function myTransformer(context: ts.TransformationContext): ts.TransformerFactory<ts.SourceFile> {
        return (sourceFile: ts.SourceFile) => {
            const visitor = (node: ts.Node): ts.Node => {
                if (ts.isFunctionDeclaration(node)) {
                    const parameters = node.parameters;
                    parameters.forEach((param) => {
                        const paramName = param.name.text;
                        // 这里获取到了每个参数的名称
                    });
                }
                return ts.visitEachChild(node, visitor, context);
            };
            return ts.visitNode(sourceFile, visitor);
        };
    }
    

总结:通过ts.getTypeChecker()获取类型检查器,进而获取节点类型;对于函数声明节点,通过name属性获取函数名,通过parameters属性获取参数列表。