TypeScript 编译器API允许在解析命令行/配置文件中使用自定义选项,

qq24tv8q  于 6个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(49)

搜索词

解析器选项编译器API

建议

为CLI解析器添加一种传递额外自定义选项的方法。

用例

我们目前正在开发一个将Typescript转换为Lua的工具。
这通过使用编译器API进行类型检查来实现。
然后将AST转换为Lua而不是JS。
我们希望用户通过CLI或tsconfig文件传递类型检查选项。目前我们通过使用parseCommandLinereadConfigFile/parseJsonConfigFileContent来实现这一点,它们都由编译器API公开。这样用户就可以像使用tsc一样使用Lua编译器。
问题是很难将自定义选项添加到解析过程中,因为parseCommandLine在选项无效时会报告错误。目前我们只是忽略由于我们的自定义选项引起的错误,但这不是一个真正干净的解决方法。对于parseJsonConfigFileContent的问题,我们目前在compilerOptions{}之外添加选项,例如:

{
  "luaTarget": "5.1",
  "compilerOptions": {...}
}

这对我们来说也不是很理想。
我们并不真的想为我们所有的tsc选项编写自己的解析器,或者除了使用parseCommandLine之外还要使用一些第三方CLI解析器。
我们也并不真的想使用我们自己的Typescript分支。

实现

如果我们可以根据const optionDeclarations: CommandLineOption[]OptionNameMap将自己的optionDeclarations传递给parseCommandLine和parseJsonConfigFileContent,那就太理想了。
一种可能的方法是在这些函数中添加一个可选参数,该参数包含一个OptionMap,而不仅仅是通过getOptionMap/getOptionFromMap获取选项,传递的参数将被用于此目的。
这需要在将这些附加选项传递给函数之前将它们与默认选项合并。另一种选择是仅让参数获取附加选项,并在解析器函数内部完成合并,这样optionDeclarations就不需要暴露了。
此外,一些与选项相关的const/函数/枚举可能需要公开。
TL;DR:这个功能可以在不改变任何功能的情况下实现,只需要对commandLineParser.ts进行一点重构(编辑:实际上我认为这需要大量的重构)。我也可以为您提供一个PR。

示例

我们现在所做的:
https://github.com/Perryvw/TypescriptToLua/blob/master/src/CommandLineParser.ts
我们基本上可以用以下代码替换大部分内容:

let typescriptToLuaOptions: OptionNameMap = {
  // our custom options
}
let commandLine = ts.parseCommandLine(args, typescriptToLuaOptions);

待办事项清单

我的建议满足以下指导原则:

  • 这不会对现有的TypeScript / JavaScript代码造成破坏性更改
  • 这不会改变现有JavaScript代码的运行时行为
  • 这可以在不根据表达式的类型生成不同的JS的情况下实现
  • 这不是一个运行时特性(例如新的表达式级语法)
ni65a41a

ni65a41a1#

了解在compilerOptions之外的选项有什么次优之处会很好 - 今天有很多工具都这样做,而且没有抱怨,但我们在这里欢迎反馈。

3gtaxfhh

3gtaxfhh2#

你仍然需要使用一些自定义逻辑来验证它们,因为它们只是以解析后的JSON格式存储在ParsedCommandLine.raw中。这不是一个大问题。
主要的问题是,我们必须将raw中的附加选项合并回CompilerOptions,因为我们需要从两者中获取值来进行转译过程。

相关问题