当我使用编译器 api 生成我的 Typescript 代码时,Printer
我的代码生成如下:
namespace Something {
export function foo() {
...
}
export function bar() {
...
}
}
namespace SomethingElse {
export function baz() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
为了可读性,我想在foo
? bar
和Something
?SomethingElse
. 这可以使用打字稿编译器api吗?
在我开始之前:是的,我确实需要(/想要)一个 DSL(即使它只是为了体验),没有其他格式可以以一种不太冗长、类型安全的方式表达我想要做的事情。
我想为我的项目(TypeScript)创建一个 DSL 编译器,并且由于该语言与 TypeScript 本身共享许多语法和概念(我是这样设计的),我想重新使用 TypeScript 编译器的部分来避免重新- 发明轮子。我最感兴趣的是scanner
,parser
和binder
。我的 DLS 的其他语义和发射部分与 TypeScript 有很大不同,我很确定从头开始编写它会更有效率。
我发现这个网站解释了编译器的实际工作原理(虽然我很确定它有点过时了),到目前为止我可以很好地理解一切。据我所知,如果我可以扩展 TypeScript 编译器,我没有理由重新发明轮子。
第一部分当然是scanner
. 我尝试用我的语言扫描文件以查看会发生什么,结果 tsc 不知道的所有内容都被归类为 ( SyntaxKind
) Identifier
(这是有道理的)。为了实现我的 DLS,我必须向这个扫描器添加关键字和语法类型,以便发送到parser
构建 AST 的 AST。parser
当然,我也必须扩展它,但这不是我现在关心的问题。
我的第一反应是克隆TypeScript 存储库并添加所需的逻辑。这样我就可以使用与上述站点相同的 API,但添加了关键字/语法/AST 节点。然后我会编写语义检查并从头开始实际发出生成的输出,一切都会好起来的。
不幸的是,这并没有真正起作用(因此有这个问题)。第一个障碍只是被存储库的大小和结构所淹没,我只是没有找到我应该看的地方。我试图创建一个使用本地源而不是内置源的小程序,但这也不起作用(可能是由于 tsc 在它处于任何可用状态之前经过了一些复杂的管道)。我确实找到了compiler.ts
,parser.ts
等文件,但没有使用我的自定义版本的方法,它们没有多大用处。我试图只将我认为需要的文件复制到我自己的项目中,但这会导致各种键入错误和功能缺失,我不知道应该如何(以及是否)修复它们。更糟的是:tsconfig.json
设置没有帮助)。
我有三个问题:
scanner
,parser
和binder
组件。)我有一个 JavaExec 类型的任务,它执行许多复杂的步骤来编译和运行应用程序。该任务是由我无法控制的插件生成的。
我想创建另一个任务来“扩展”此任务,添加额外的依赖项配置。此配置存储一些仅应包含于此特定任务的依赖项。
有没有一种简单的方法可以让我创建这样的任务,或者我是否必须手动复制所有配置属性(可能随时更改)?
我正在为fetch-api创建一个类型安全的包装器,并且我注意到打字稿编译器将其归类为完全有效的代码:
function foo(response: Response): Promise<Bar> { //response received from a fetch() call
const json: Promise<any> = response.json();
return json; //Promise<any> can be returned as Promise<Bar>?
}
Run Code Online (Sandbox Code Playgroud)
为什么可以直接返回Promise<any>
as Promise<Bar>
?这不应该需要某种类型的断言吗?
我想使用 typescript 转换器 api 编写一个自定义转换器,输出 typescript 而不是 javascript。为了实现这一点,我需要禁用默认转换器(typescript \xe2\x86\x92 ecma2017 \xe2\x86\x92 ecma2016 \xe2\x86\x92 ...)。
\n\n这可能吗?我更喜欢直接使用tsc
,但如果我必须手动使用编译器 api 也没关系。