Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
如何使用API创建TypeScript诊断?_Typescript_Typescript Compiler Api - Fatal编程技术网

如何使用API创建TypeScript诊断?

如何使用API创建TypeScript诊断?,typescript,typescript-compiler-api,Typescript,Typescript Compiler Api,我正在使用带有自定义转换器的TypeScript LanguageService API来修改AST。我希望能够生成自定义诊断,以便以有意义的方式报告错误。我该怎么做 CustomTransformer API不允许报告诊断--- 诊断对象本身没有任何类型的公共构造函数。(编译器在内部使用ts.createDiagnosticFromNode()函数族,但这些函数被标记为内部函数,不在公共API中。) LanguageService和TransformationContext看起来都没有任何钩

我正在使用带有自定义转换器的TypeScript LanguageService API来修改AST。我希望能够生成自定义诊断,以便以有意义的方式报告错误。我该怎么做

  • CustomTransformer API不允许报告诊断---

  • 诊断对象本身没有任何类型的公共构造函数。(编译器在内部使用
    ts.createDiagnosticFromNode()
    函数族,但这些函数被标记为内部函数,不在公共API中。)

  • LanguageService和TransformationContext看起来都没有任何钩子,允许我注册一种方法来创建自己的诊断,甚至可以注册任何方法来钩住编译器,以便我可以在适当的阶段手动遍历AST(如果我想自己这样做的话)

除了上面引用的链接之外,我找不到任何,也就是说,没有一个参考文献,提到任何人谈论这个问题。我发现不可能相信TypeScript API不支持这一点,因为产生错误本质上是编译器的目的;这说明我找错地方了


那么,我应该寻找什么呢?我如何才能做到这一点?

您基本上已链接到答案,诊断信息将在发出之前收集并显示给用户。也就是说,在emit Through(与创建.d.ts文件相关)期间会发生声明诊断。是的,编译器是关于显示错误的,但这并不是在emit期间都会发生的。当您在转换中看到警告时,您可以将其注销给用户,或者抛出错误以停止。当然可以,但如何收集和显示诊断?我找不到任何钩子让我这么做。我甚至不能创建诊断,因为这样做的函数没有导出!最简单的方法是使用helper
ts.getPreEmitDiagnostics
从程序中获取诊断信息。您可以实现自己的符合
ts.Diagnostic
的对象,然后通过将
ts.formatDiagnosticsWithColorAndContext
的结果输出到控制台,将这些对象与程序中的诊断一起显示。或者,只需将您自己的消息与这些消息一起输出到控制台。基本上,正如该问题中所述,您需要在更高的级别上执行此操作,而不仅仅是在转换函数中执行此操作。是的,但这种更高级别的方式是什么?似乎没有钩子可以让我遍历类型检查树(更不用说Javascript转换树);无法将诊断信息传递给编译器进行重复数据消除和聚合。现在我有一个非常临时的解决方法,它涉及使用一个自定义的
declare
语句来公开
createDiagnosticFromNode()
,我保留我自己的列表,我从
emit
生成该列表,并将其与编译器中的诊断合并,但这显然太可怕了,不可能是它的预期效果。