我正在为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;
答案 0 :(得分:2)
您可以使用lib.d.ts和Array执行与ArrayConstructor相同的操作:
interface Parser {}
interface ParserConstructor {
new (options?: ParserOptions): Parser;
(options?: ParserOptions): Parser;
}
declare const Parser: ParserConstructor;
let p1 = Parser();
let p2 = new Parser();
答案 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" });