20

我有一个构建链设置,它将文件从咖啡脚本转换为打字稿到 javascript。我的问题是:将类型签名添加到 coffeescript 函数的最小侵入方式是什么?

coffeescript 通过反引号支持原始 javascript。但是,这意味着 coffeescript 不再理解反引号代码段。

Coffeescript 拒绝这些:

f = (`a:String`) -> a + 2
f = (a`:String`) -> a + 2

我可以在函数上面写这个:

`var f = (String) => any`

它编译,但不进行类型检查。我认为这是因为 Coffeescript 已经声明了该变量。

我能弄清楚如何让它工作的唯一方法需要大量的样板文件

f = (a) ->
  `return (function(a:String){`
  a + 2;
  `})(a)`

在新的 Coffeescript Redux 编译器中,反引号似乎无法正常工作: https ://github.com/michaelficarra/CoffeeScriptRedux/issues/71

我很清楚这是一项可疑的努力,现在只是一个实验。我目前使用contracts.coffee,但我正在寻找实际类型。

4

4 回答 4

20

这是我的项目,它将 CoffeeScript 转换为 TypeScript,然后将其与包含类型的 d.ts 文件合并。然后报告编译错误,如果有的话。

它被称为Compiled-Coffee

于 2014-02-12T21:01:12.253 回答
16

如果你想写CoffeeScript,最好写CoffeeScript并编译成JavaScript。

TypeScript 的好处主要是设计时的好处和更好的工具,因此在 CoffeeScript 和 JavaScript 中间使用它几乎没有什么好处,因为您将获得基于 CoffeeScript 代码的设计时间和工具。

您可以在 TypeScript 中使用您用 CoffeeScript 编写的库,反之亦然,因此您可以在 CoffeeScript 中维护您的 CoffeeScript 库,并在您决定采用哪种方式时在新的 TypeScript 文件中使用它们。

更新:我不确定这个答案怎么会有如此广泛的误解——我会假设我没有很好地解释这一点(而不是假设这仅仅是稻草人的论点或对语言的过度敏感)比较)。

TypeScript 确实是 JavaScript 的类型系统。静态类型更适合您作为工作流程早期的程序员。在您的 IDE 中设置设计时警告意味着快速纠正常见错误,例如输入错误的变量名称、错误的参数、无效的操作等等。将代码加下划线并带有错误注释意味着即时反馈。在编译时有这个很好,但你的反馈循环更长。我什至不会谈论运行时,因为在使用 TypeScript 时所有类型都被删除了。

至于所有“TypeScript vs CoffeeScript”评论——这个问题根本不是关于这个的。问题是关于从 CoffeeScript 编译到 TypeScript 再到 JavaScript。让我们看看为什么这可能不理想:

  • 您只会在编译时获得类型反馈
  • 你不会得到自动完成
  • 您的 CoffeeScript 代码将不再紧凑 - 它将具有类型注释
  • 如果没有中间编译器,您的 CoffeeScript 代码将不再有效
  • 您将不得不使用额外的编译器,并且它需要与 CoffeeScript 版本 x 和 TypeScript 版本 y 同步
  • 您的 IDE 无法理解您的 CoffeeScript 代码
于 2012-10-14T12:47:21.440 回答
2

我认为我想出的是我能做的最好的。在新的 Coffeescript Redux 编译器中,事情变得更加困难:尝试破解当前的 coffeescript 编译器以使其工作实际上会更容易。

使这看起来不那么骇人听闻的方法是:

`var f : (a:Number) => Number = originalF`

但是,typescript 的弱类型推断在这种形式下表现不佳。这得到正确的类型分析:

f = (a) ->
  `var a : Number = a`
  a + 2

但是,我仍然不确定如何使用此表单指定返回值。

于 2012-10-15T00:07:16.813 回答
2

Typescript 是一个强类型的javascript。Coffee-script 提供了一种更舒适的书写和阅读方式。我不将咖啡脚本视为一种语言。它只是一种方式,一种可以附加到任何语言的风格:咖啡风格智能计算机语言应该是未来

通过反引号来“支持”如此强大的类型是非常丑陋和愚蠢的。使用强类型实现咖啡脚本的正确方法:

  • 修改CoffeeScriptRedux源码,添加支持的强类型
  • 修改 Typescript 解析器源以使用咖啡脚本语法。
    • 似乎没有人这样做。
于 2015-07-03T08:41:09.423 回答