使用函数构造函数+ prototype作为类型,以避免重写大部分代码库

时间:2015-02-02 13:59:28

标签: typescript

有没有办法让tsc解释导出构造函数+原型作为类型的外部模块?

在将大型代码库转换为TypeScript时,我发现typescript无法识别导出函数构造函数的外部模块,并且它的原型是类型。

function P() {...}
P.prototype.method = function() {...};
...
export = P;

如果我稍后import这个文件,那么类型只是函数签名而不是类类。这给了我类型错误,例如:

import P = require('P');
var c:P = new P(); // cannot find name P
var c = new P(); // c has no type information

我知道我应该重写代码以使用带有类和接口的typescript类型,但如果我能逐步完成并且至少使用tsc编译项目,那将是非常好的。 。我最近发现你可以使用导出单例对象的外部模块的类型:

var S = {...};
export S;

......并在另一个档案中:

import S = require('s');
interface C {
  s:typeof S; // notice the "typeof"
}

你可以使用typeof的打字稿的实例类型并不明显,而且非常隐藏在文档中。我想知道在使用普通的javascript原型时是否有这样的技巧。

2 个答案:

答案 0 :(得分:2)

如果我理解它是正确的,那么你有' javascript'样式打字稿文件。

您可能需要选择要对当前代码执行的操作。将其保留为.js或将其转换为.ts

我们遇到了相同的情况,我们选择保留.js并为.js文件生成.d.ts文件。仅适用于我们在.ts中使用的函数和类,仅在我们需要时才使用。

最后,它对我们使用的.js函数以及过时的代码提供了非常好的概述。

答案 1 :(得分:1)

正如Martijn所提到的,您可能只想创建一个.d.ts。我怀疑你已经得出了这个结论,并寻求如何做到这一点的指导。

针对您的特定情况p.d.ts

declare module "P" {
    class P {
        method:Function;
    }
    export = P;
}

用法:

/// <reference path="./p.d.ts"/>
import P = require("P");
var p = new P();
p.method(); // OKay