如何定义一个同名的Typescript构造函数和工厂函数

How to define a Typescript constructor and factory function with the same name?

本文关键字:构造函数 Typescript 函数 工厂 一个 何定义 定义      更新时间:2023-09-26

我正在为现有的Javascript库编写Typescript定义文件。在这个库中,有一些函数可以作为构造函数或工厂调用。如何以兼容的方式编写类型?

下面是根据README:

需要支持的调用的具体示例:
var streamParser = N3.StreamParser();
var streamParser = new N3.StreamParser();

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

function Parser(options?: ParserOptions): N3Parser;

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

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

但是这两种方法是不兼容的。声明文件deep-dive的开头段落表明这是可能的,但没有给出示例。

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

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

您可以按照lib. d.s中使用Array和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)

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" });