簡體   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