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