如何定义具有相同名称的Typescript构造函数和工厂函数?

时间:2016-10-20 15:12:53

标签: javascript typescript

我正在为existing Javascript library编写一个Typescript定义文件。 在这个库中有一些函数可以称为构造函数或工厂。 如何以兼容的方式编写打字?

以下是need to be supported according to the README

的调用的具体示例
var streamParser = N3.StreamParser();
var streamParser = new N3.StreamParser();

我目前的做法是只支持工厂。

function Parser(options?: ParserOptions): N3Parser;

new工作的明显方法是创建一个类。

class Parser {
  constructor(options ? : ParserOptions);
}

但这两种方法是不相容的。 declartion-file deep-dive的开头段落表明这是可能的,但没有给出任何例子。

注意: 以下两个定义是兼容的但是......那么,是什么?

interface Parser {
  new: (options ? : ParserOptions) => N3Parser;
}

function Parser(options ? : ParserOptions): N3Parser;

2 个答案:

答案 0 :(得分:2)

您可以使用lib.d.tsArray执行与ArrayConstructor相同的操作:

interface Parser {}

interface ParserConstructor {
    new (options?: ParserOptions): Parser;
    (options?: ParserOptions): Parser;
}

declare const Parser: ParserConstructor;

let p1 = Parser();
let p2 = new Parser();

code in playground

答案 1 :(得分:0)

Nitzan Tomer的回答是正确的。

对于我的特定情况,构造的对象具有不同的接口,构造函数需要一些重载。 以下示例显示了构造函数接口如何轻松支持这些要求。

interface N3Parser { }
interface ParserOptions {[key: string]: string }

interface ParserConstructor {
    new (options?: ParserOptions): N3Parser;
    (options?: ParserOptions): N3Parser;

    new (fd: any, options?: ParserOptions): N3Parser;
    (fd: any, options?: ParserOptions): N3Parser;
}
declare const Parser: ParserConstructor;

let p1 = Parser();
let p2 = new Parser();

let p3 = Parser({ x: "y" });
let p4 = new Parser(3, { x: "y" });