在TypeScript代码中扩展使用RequireJS加载的CoffeeScript类

时间:2014-10-04 14:51:38

标签: coffeescript requirejs typescript

目前我有一个使用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代码扩展并且不会失去所有类型的安全性?

1 个答案:

答案 0 :(得分:2)

最后我找到了解决方案。这是特殊的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调用。