面试题答案
一键面试- 获取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); }; }
- 在TypeScript自定义Transformer中,可以使用
- 获取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); }; }
- 不同类型的节点获取名称的方式不同。对于函数声明节点(
- 获取函数声明节点的参数列表:
- 对于函数声明节点(
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
属性获取参数列表。