简而言之:有没有办法知道是否需要typescript参数和/或有默认值?
更长的版本:说我有以下文件:
//Foo.ts class Bar { foo(required:string,defaultValue:number=0,optional?:boolean) { ... } }
我想知道每个参数:
名字
类型
需要吗?
它有默认值吗?
我已成功使用方法装饰用的打字稿反射API来获取参数类型,我用这个方法来获得他们的名字,但到目前为止,我还没有找到一个办法知道,如果一个变量需要和/或有一个默认值.
我知道typescript编译器本身可以在typescript中使用.所以我想知道是否有办法使用编译器的解析树来查看是否需要参数和/或是否有默认值?
那会怎么样?
如果你想从头做这个...
在高层次上,一种方法是:
弄清楚如何SourceFile
使用文件的编译器api 获取节点.这本身就需要一些解释.
从那里,使用API的forEachChild
功能遍历文件中的所有节点,并找到一个节点kind
的SyntaxKind.ClassDeclaration
并用文本.NAME属性Bar
.
然后再次使用api forEachChild
函数遍历类的所有子节点,并获取SyntaxKind.MethodDeclaration
具有text和.name属性的文本foo
.
要获取参数,您需要遍历方法节点的parameters
属性.
然后,对于每个参数节点,获取您可以.getText()
在.name
属性上调用的名称.
您可以通过执行以下操作来判断参数是否可选:
const parameterDeclaration = parameterNode as ts.ParameterDeclaration; const isOptional = parameterDeclaration.questionToken != null || parameterDeclaration.initializer != null || parameterDeclaration.dotDotDotToken != null;
或者你可以使用TypeChecker
的isOptionalParameter
方法.
要获取其默认表达式,您只需检查initializer
属性:
propertyDeclaration.initializer;
要获取型使用TypeChecker
的getTypeOfSymbolAtLocation
方法,并通过在节点......这有点复杂,所以我也就懒得解释它一点点的符号(想想它是如何与工会种类和不同).
不要从头开始......
我已经创建了一个围绕TypeScript编译器api的包装器.只需将此代码与ts-simple-ast一起使用(编辑:以前这里谈到了我的旧ts-type-info库,但是ts-simple-ast要好得多):
import Project from "ts-simple-ast"; // read more about setup here: // https://dsherret.github.io/ts-simple-ast/setup/adding-source-files const project = new Project({ tsConfigFilePath: "tsconfig.json" }); const sourceFile = project.getSourceFileOrThrow("src/Foo.ts"); const method = sourceFile.getClassOrThrow("Bar").getInstanceMethodOrThrow("foo");
获得该方法后,从参数中获取所需的所有信息非常简单:
console.log(method.getName()); // foo for (const param of method.getParameters()) { console.log(param.getName()); console.log(param.getType().getText()); console.log(param.isOptional()); console.log(param.getInitializer() != null); }