Reflection Typescript反射-所需参数&;默认值
简而言之:有没有办法知道typescript参数是必需的和/或有默认值? 较长版本: 假设我有以下文件:Reflection Typescript反射-所需参数&;默认值,reflection,typescript,optional-parameters,Reflection,Typescript,Optional Parameters,简而言之:有没有办法知道typescript参数是必需的和/或有默认值? 较长版本: 假设我有以下文件: //Foo.ts class Bar { foo(required:string,defaultValue:number=0,optional?:boolean) { ... } } 我想知道每个参数: console.log(method.getName()); // foo for (const param of method.getParameter
//Foo.ts
class Bar {
foo(required:string,defaultValue:number=0,optional?:boolean) {
...
}
}
我想知道每个参数:
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);
}
- 名字
- 类型
- 需要吗
- 它有默认值吗
这将如何工作?如果您想从头开始做这件事… 在高层次上,一种方法是:
SourceFile
节点。这本身就需要一点解释forEachChild
函数循环文件中的所有节点,并找到kind
为SyntaxKind.ClassDeclaration
的节点和.name属性为textBar
forEachChild
函数循环该类的所有子类,并获取具有kindSyntaxKind.MethodDeclaration
和.name属性且文本为foo
的子类参数
属性.name
属性上调用.getText()
const parameterDeclaration = parameterNode as ts.ParameterDeclaration;
const isOptional = parameterDeclaration.questionToken != null || parameterDeclaration.initializer != null || parameterDeclaration.dotDotDotToken != null;
或者您可以使用TypeChecker
的isOptionalParameter
方法初始值设定项
属性:
propertyDeclaration.initializer;
TypeChecker
的getTypeOfSymbolAtLocation
方法并传入节点的符号。。。这变得有点复杂,所以我不想费心解释它(想想它与联合类型等有什么不同)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);
}
如果你感兴趣,我一直在做这个:。在我写这篇文章的时候,它是不稳定的,可能会发生剧烈的变化。它做你想要的一切,除了现在它只说如果参数是可选的,没有指定可选的是否是默认值,但是我可以很快添加它。很好!确实看起来正是我想要的。我会尽快让它工作。是的,在输出中添加默认值真的很好,我向其中添加了
defaultExpression
。请看下面我的答案。谢谢你的详细解释。我开始发现所有这些步骤,并认为这将需要相当多的努力,所以我很高兴找到您的库。据我所知,它是最好的typescript反射api,对此我感到惊讶。@Flion谢谢,在这个线程之前我没有告诉任何人,因为我希望它首先更稳定。它还需要几周的工作:)