Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection Typescript反射-所需参数&;默认值_Reflection_Typescript_Optional Parameters - Fatal编程技术网

Reflection 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

简而言之:有没有办法知道typescript参数是必需的和/或有默认值?

较长版本: 假设我有以下文件:

//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);
}
  • 名字
  • 类型
  • 需要吗
  • 它有默认值吗
我已经成功地使用了获取参数类型,我已经获取了它们的名称,但到目前为止,我还没有找到一种方法来知道某个变量是否是必需的和/或是否具有默认值

我知道typescript编译器本身可以在typescript中使用。所以我想知道是否有一种方法可以使用编译器的解析树来查看参数是否是必需的和/或是否有默认值


这将如何工作?

如果您想从头开始做这件事…

在高层次上,一种方法是:

  • 了解如何使用文件的编译器api获取
    SourceFile
    节点。这本身就需要一点解释
  • 从这里开始,使用api的
    forEachChild
    函数循环文件中的所有节点,并找到
    kind
    SyntaxKind.ClassDeclaration
    的节点和.name属性为text
    Bar
  • 然后再次使用api的
    forEachChild
    函数循环该类的所有子类,并获取具有kind
    SyntaxKind.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
    方法并传入节点的符号。。。这变得有点复杂,所以我不想费心解释它(想想它与联合类型等有什么不同)

  • 不要白手起家……

    我已经围绕TypeScript编译器api创建了一个包装器。只需将此代码用于(编辑:前面提到了我的旧库,但ts simple ast要好得多):

    一旦有了该方法,就可以直接从其参数中获取所需的所有信息:

    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谢谢,在这个线程之前我没有告诉任何人,因为我希望它首先更稳定。它还需要几周的工作:)