Fli*_*ion 6 reflection optional-parameters typescript
简而言之:有没有办法知道是否需要typescript参数和/或有默认值?
更长的版本:说我有以下文件:
//Foo.ts
class Bar {
foo(required:string,defaultValue:number=0,optional?:boolean) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道每个参数:
我已成功使用方法装饰用的打字稿反射API来获取参数类型,我用这个方法来获得他们的名字,但到目前为止,我还没有找到一个办法知道,如果一个变量需要和/或有一个默认值.
我知道typescript编译器本身可以在typescript中使用.所以我想知道是否有办法使用编译器的解析树来查看是否需要参数和/或是否有默认值?
那会怎么样?
如果你想从头做这个...
在高层次上,一种方法是:
SourceFile使用文件的编译器api 获取节点.这本身就需要一些解释.forEachChild功能遍历文件中的所有节点,并找到一个节点kind的SyntaxKind.ClassDeclaration并用文本.NAME属性Bar.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;
Run Code Online (Sandbox Code Playgroud)
或者你可以使用TypeChecker的isOptionalParameter方法.
要获取其默认表达式,您只需检查initializer属性:
propertyDeclaration.initializer;
Run Code Online (Sandbox Code Playgroud)要获取型使用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");
Run Code Online (Sandbox Code Playgroud)
获得该方法后,从参数中获取所需的所有信息非常简单:
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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |