【问题标题】:Extend a CoffeeScript class loaded with RequireJS inside a TypeScript code在 TypeScript 代码中扩展使用 RequireJS 加载的 CoffeeScript 类
【发布时间】:2014-10-05 02:03:33
【问题描述】:

目前我有一个用 CoffeeScript 开发的大型代码库,并想用一些 TypeScript 来扩展它。

假设我在CoffeeClass.coffee 文件中有以下代码:

define 'CoffeeClass', ->
  class CoffeeClass
    foo: () -> 1

打算通过require以如下方式加载(我们称这个文件为CoffeeUser.coffee):

require ['CoffeeClass'], (CoffeeClass) ->
  class MyClass extends CoffeeClass
    foo: () -> super() + 1
  console.log (new MyClass().foo()) # => 2

现在可以使用标准 RequireJS 标记在浏览器中加载它:

<script data-main="CoffeeUser.js" src="require.js"></script>

我想从 TypeScript 代码中扩展 CoffeeClass。这就是我尝试过的:

首先编写一个CoffeeClass.d.ts 定义文件(我知道这是错误的,但它显示了我想要实现的目标):

export class CoffeeClass {
  foo(): number;
}

然后尝试从TypeScriptUser.ts使用它:

import CoffeeClass = require('CoffeeClass');
class TypeScriptUser extends CoffeeClass {
  foo(): number {
    return super.foo() + 1;
  }
}

但它无法编译,部分原因是我找不到d.ts 文件的正确语法,部分原因是我无法正确告诉编译器如何扩展CoffeeClass(据我所知编译器无法理解CoffeeClass 确实是一个,而不仅仅是一个模块)。

那么我可以告诉 TypeScript 编译器 模块一个类 吗?如果不是,您会建议我如何更改 CoffeeClass 设计以从 TypeScript 代码扩展它并且不失去所有类型安全性?

【问题讨论】:

    标签: coffeescript requirejs typescript


    【解决方案1】:

    我终于找到了解决方案。这就是特殊的export = 语法。这里是。 CoffeeClass.d.ts:

    declare class CoffeeClass {
        foo(): number;
    }
    
    export = CoffeeClass;
    

    还有TypeUser.ts:

    /// <reference path="CoffeeClass.d.ts" />
    import CoffeeClass = require('CoffeeClass')
    class MyClass extends CoffeeClass {
        foo() {
            return super.foo() + 1;
        }
    }
    
    console.log(new MyClass().foo()); // => 2
    

    请注意,编译器会在编译代码时推断出正确的require 调用。

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2013-03-29
      相关资源
      最近更新 更多