2014-10-04 49 views
1

目前我有一個用CoffeeScript開發的大型代碼庫,並且希望用一些TypeScript擴展它。在TypeScript代碼中擴展裝有RequireJS的CoffeeScript類

比方說,我在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 definiton文件(我知道這是錯誤的,但它顯示我想要實現):

export class CoffeeClass { 
    foo(): number; 
} 

,然後嘗試從TypeScriptUser.ts使用:

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

但它不會編譯部分,因爲我無法找到正確的語法爲d.ts文件,部分原因是因爲我不能正確地告訴編譯器如何將CoffeeClass(據我CA擴展ñ告訴編譯器不能理解CoffeeClass真的是一個而不只是一個模塊)。

所以我可以告訴打字稿編譯器模塊在這裏?如果不是,你會如何推薦我更改CoffeeClass設計,以便將其從TypeScript代碼擴展並且不會丟失所有類型的安全性?

回答

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電話。