[英]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.