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