【问题标题】:It is possible to transpile into TypeScript using Babel?可以使用 Babel 转译成 TypeScript 吗?
【发布时间】:2020-03-01 16:55:26
【问题描述】:

我了解 Babel now has support for TypeScript 样式类型注释。但是,它不像 TypeScript 编译器那样检查类型,它会从输出中删除类型注释。我想要实现的是:

  1. 将带有 TypeScript 注释的 stage-0 代码转换为 vanilla TypeScript
  2. 使用 TypeScript 编译器检查类型
  3. 输出与 Node 或浏览器兼容的 JavaScript

这可能吗?

【问题讨论】:

  • @babel/preset-typescript 应该允许您使用 babel 转译 typescript 而不是使用 tsc。您是否遇到过这方面的问题?
  • @apokryfos - 正如 OP 所说,这只允许解析注释,而不是类型检查。请参阅上面 OP 列表中的 #2。
  • 那么据我所知这是不可能的。
  • @apokryfos - 原来是这样!我也很惊讶,但现在我为自己的惊讶感到内疚……巴别塔的人真的很好。

标签: javascript typescript babeljs


【解决方案1】:

我很好奇,所以我 pinged Nicolò Ribaudo 在 Babel 上做了很多工作,事实证明这比我想象的要容易:你可以告诉 Babel 解析类型注释但不能 删除它们通过使用 TypeScript 语法插件 (@babel/plugin-syntax-typescript) 而不是 TypeScript preset (@babel/preset-typescript)。

例如,如果您想转换对管道运算符的支持,您的 .babelrc 可能如下所示:

{
  "plugins": [
    "@babel/plugin-syntax-typescript",
    [
      "@babel/plugin-proposal-pipeline-operator",
      {
        "proposal": "minimal"
      }
    ]
  ]
}

如果你给 Babel 这个 .ts 文件:

function doubleSay(str: string) {
  return str + ", " + str;
}
function capitalize(str: string) {
  return str[0].toUpperCase() + str.substring(1);
}
function exclaim(str: string) {
  return str + '!';
}

let result = "hello"
  |> doubleSay
  |> capitalize
  |> exclaim;

console.log(result);

...它使用管道运算符生成此输出,但类型注释仍然存在:

var _ref, _ref2, _hello;

function doubleSay(str: string) {
  return str + ", " + str;
}

function capitalize(str: string) {
  return str[0].toUpperCase() + str.substring(1);
}

function exclaim(str: string) {
  return str + '!';
}

let result = (_ref = (_ref2 = (_hello = "hello", doubleSay(_hello)), capitalize(_ref2)), exclaim(_ref));
console.log(result);

【讨论】:

  • 它不会转译它们,但输出文件对我来说仍然是 .js。有什么方法可以保留给定的扩展名(ts/tsx?)编辑:babel src -d dist --extensions '.ts,.tsx' --keep-file-extension"works
猜你喜欢
  • 2016-09-28
  • 2019-02-16
  • 2019-09-22
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
相关资源
最近更新 更多