简而言之:有没有办法知道是否需要打字稿参数和/或是否有默认值?
更长的版本: 说我有以下文件:
//Foo.ts
class Bar {
foo(required:string,defaultValue:number=0,optional?:boolean) {
...
}
}
我想知道每个参数:
我已成功使用method decorators与TypeScript reflection API获取参数类型,我已使用this method获取其名称,但到目前为止我还没有找到了解变量是否必需和/或具有默认值的方法。
我知道打字稿编译器本身可以在打字稿中使用。所以我想知道是否有办法使用编译器的解析树来查看是否需要参数和/或是否有默认值?
那会怎么样?
答案 0 :(得分:5)
如果您想从头开始......
从较高的层面来说,一种方法是:
SourceFile
节点。这本身就需要一些解释。forEachChild
函数循环遍历文件中的所有节点,找到kind
SyntaxKind.ClassDeclaration
和.name属性的节点文字Bar
。forEachChild
函数遍历该类的所有子项,并获取具有SyntaxKind.MethodDeclaration
和.name属性的文本{{1} }。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
方法并传入节点的符号...这有点复杂,所以我赢了#39不要理解它(想想它与工会类型等有何不同)。
不要从头开始......
我已经在TypeScript编译器api周围创建了一个包装器。只需将此代码与ts-simple-ast一起使用(编辑:以前这里谈到了我的旧ts-type-info库,但ts-simple-ast要好得多):
getTypeOfSymbolAtLocation
获得该方法后,从参数中获取所需的所有信息非常简单:
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");