当前位置:  开发笔记 > 编程语言 > 正文

Typescript反射 - 必需参数和默认值

如何解决《Typescript反射-必需参数和默认值》经验,为你挑选了1个好方法。

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

更长的版本:说我有以下文件:

//Foo.ts
class Bar {
    foo(required:string,defaultValue:number=0,optional?:boolean) {
        ...
    }
}

我想知道每个参数:

名字

类型

需要吗?

它有默认值吗?

我已成功使用方法装饰用的打字稿反射API来获取参数类型,我用这个方法来获得他们的名字,但到目前为止,我还没有找到一个办法知道,如果一个变量需要和/或有一个默认值.

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

那会怎么样?



1> David Sherre..:

如果你想从头做这个...

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

    弄清楚如何SourceFile使用文件的编译器api 获取节点.这本身就需要一些解释.

    从那里,使用API的forEachChild功能遍历文件中的所有节点,并找到一个节点kindSyntaxKind.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;
    

    或者你可以使用TypeCheckerisOptionalParameter方法.

    要获取其默认表达式,您只需检查initializer属性:

    propertyDeclaration.initializer;
    

    要获取型使用TypeCheckergetTypeOfSymbolAtLocation方法,并通过在节点......这有点复杂,所以我也就懒得解释它一点点的符号(想想它是如何与工会种类和不同).

不要从头开始......

我已经创建了一个围绕TypeScript编译器api的包装器.只需将此代码与ts-simple-ast一起使用(编辑:以前这里谈到了我的旧ts-type-in​​fo库,但是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);
}

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有