首页 > 解决方案 > 剥离 TypeScript 注释而不进行其他转译(包括第 3 阶段提案)并保留换行符

问题描述

如何从 TS 3.9 模块中去除所有 TS 类型和类型注释,而不执行任何其他转换(包括私有类字段,#foo

我正在为一个使用普通 JS 和第 3 阶段提案的 OSS 项目做出贡献,但我想在 TypeScript 中构建我的代码并使用自动构建步骤来去除所有 TS 注释并最终得到一个 .mjs 文件,我可以在上游检查。

我的代码不使用任何具有运行时足迹的 TS 功能(例如命名空间、枚举)。我只是使用 TS 进行类型检查。

到目前为止,我已经尝试过 TSC 和 Babel,但它们每个都有问题。

这是 TSC 版本:

tsc src/lib/LocalDateTime.ts --lib ESNext --target ESNext --module ESNext --isolatedModules --declaration --allowSyntheticDefaultImports --moduleResolution node --useDefineForClassFields true
mv code.js code.mjs

TSC 不理会我所有的代码,但它不保留换行符。如果代码块之间没有行间距,则生成的代码更难阅读,并且不适合在上游检查。

TSC 也弄乱了缩进,但 prettier 可以解决这个问题。我只需要保留换行符。我对尝试以自动方式添加换行符的后 TSC 格式化程序不感兴趣。我只想在原始代码中保留原始换行符。

这是一个也接近工作的 Babel 7.10 配置:

{
  "retainLines": true,
  "plugins": ["@babel/plugin-proposal-class-properties"],
  "presets": [
    [
      "@babel/preset-typescript",
      {
        "allowNamespaces": false,
        "onlyRemoveTypeImports": true
      }
    ]
  ]
}

该配置只留下我的换行符(好!),但它也转换使用第 3 阶段私有类字段,这很糟糕,因为我想#foo在 JS 输出中保留本机属性语法。我只希望我的运行时代码不受影响,但 TS 部分被剥离了。

如何?

标签: typescriptbabeljs

解决方案


我有一种感觉,以这种方式开发会很快回来咬你,但是你可以配置 babel 来解析,但不能转换,大多数语法。通过使用一组并行插件,

在这种情况下,变化@babel/plugin-proposal-class-properties变成@babel/plugin-syntax-class-properties

.babelrc.json

{
  "retainLines": true,
  "plugins": ["@babel/plugin-syntax-class-properties"],
  "presets": [
    [
      "@babel/preset-env",
      "@babel/preset-typescript",
      {
        "allowNamespaces": false,
        "onlyRemoveTypeImports": true
      }
    ]
  ]
}

这是repl中的一个示例。


推荐阅读