【问题标题】:Adding Typescript to Coffeescript将打字稿添加到 Coffeescript
【发布时间】:2012-10-04 04:56:52
【问题描述】:

我有一个构建链设置,可以将文件从 coffeescript 转换为 typescript 到 javascript。我的问题是:向 coffeescript 函数添加类型签名的最小侵入方式是什么?

coffeescript 通过反引号支持原始 javascript。但是,这意味着 coffeescript 不再理解反引号 sn-p。

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,但我正在寻找实际类型。

【问题讨论】:

  • 也许您应该选择一种语言或另一种语言。你的代码让被误导的 Pascal 程序员在编写 C 语言时想起了 #define BEGIN {
  • 这似乎不是一个好主意...
  • 你们之前的两位评论者,显然将两者混为一谈是可怕的。我相信这就是 为什么 OP 要求并想要一个解决方案...

标签: coffeescript typescript


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 不确定类型不是 TypeScript 的主要优点之一。你用过吗?
  • @GregWeber 类型确实是一个好处,但主要是在设计时。如果你的设计时间是 CoffeeScript,它被编译成 TypeScript,类型检查的好处将大大降低,因为你只会在 TypeScript 编译成 JavaScript 时知道错误。 TypeScript 的理念是为设计时带来更好的工具,以提高开发人员的工作效率。
  • @GregWeber 这是一个有用的视频,Anders Hejlsberg 在其中解释了这一点,可能比我做得更好 - channel9.msdn.com/posts/…
  • 格雷格是对的。类型是,恕我直言,作为 vim 用户,TypeScript 的主要好处。请注意,即使语言作者不打算这样做也是如此。
  • @GregWeber 类型是 TypeScript 的主要优势;在这种情况下,类型的主要好处是改进了工具。当您使用 JavaScript 时,所有类型信息都会丢失。即使你在 CoffeeScript 中用反引号声明函数,如果你从 CoffeeScript 调用这些函数,你也不会得到任何类型检查。
【解决方案2】:

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

让这个看起来不那么老套的方法是:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    它叫Compiled-Coffee

    【讨论】:

    • 应该叫ToffeeScript
    【解决方案4】:

    Typescript 是一种强类型 javascript。 Coffee-script 提供了一种更舒适的书写和阅读方式。 我不将咖啡脚本视为一种语言。 这只是一种方式,一种可以附加到任何语言的风格:Coffee Style Smart Computer Language should be the future

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

    • 修改CoffeeScriptRedux源添加支持的强类型
    • 修改 Typescript 解析器源以使用咖啡脚本语法。
      • 似乎没有人这样做。

    【讨论】:

    • 我希望有些人可以做最后一个,以允许 TypeScript 中的一些 coffescripty 语法:-)
    猜你喜欢
    • 2017-11-14
    • 2012-10-14
    • 1970-01-01
    • 2022-11-11
    • 2018-11-01
    • 2021-07-30
    • 2018-06-13
    • 2019-05-27
    • 2019-11-07
    相关资源
    最近更新 更多