2014-10-04 2 views
1

В настоящее время у меня есть большая база кода, разработанная с помощью CoffeeScript, и вы хотите расширить ее с помощью некоторого TypeScript.Расширьте класс CoffeeScript, загруженный RequireJS внутри кода 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> 

Я хочу расширить код CoffeeClass с помощью кода типа TypeScript. Это то, что я пробовал:

Первая запись файла в 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 (насколько я ок n сказать, что компилятор не может понять, что 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 вызов при компиляции кода.

Смежные вопросы