繁体   English   中英

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

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

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

这是根据README需要支持的调用的特定示例:

var streamParser = N3.StreamParser();
var streamParser = new N3.StreamParser();

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

function Parser(options?: ParserOptions): N3Parser;

使new生效的显而易见的方法是创建一个类。

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

但是这两种方法是不兼容的。 声明文件深入探讨的开头一段表明这是可能的,但未给出示例。

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

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

function Parser(options ? : ParserOptions): N3Parser;

您可以按照其在做同样的事情lib.d.ts阵列ArrayConstructor

interface Parser {}

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

declare const Parser: ParserConstructor;

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

操场上的代码

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM