如何定义一个同名的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);
}
但是这两种方法是不兼容的。声明文件deep-dive的开头段落表明这是可能的,但没有给出示例。
注意:以下两个定义是兼容的,但是…所以,什么?
interface Parser {
new: (options ? : ParserOptions) => N3Parser;
}
function Parser(options ? : ParserOptions): N3Parser;
您可以按照lib. d.s中使用Array和ArrayConstructor所做的相同的事情:
interface Parser {}
interface ParserConstructor {
new (options?: ParserOptions): Parser;
(options?: ParserOptions): Parser;
}
declare const Parser: ParserConstructor;
let p1 = Parser();
let p2 = new Parser();
(code in playground)
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" });
相关文章:
- 理解typescript中的构造函数接口
- typescript定义构造函数或函数
- Typescript class.default 不是构造函数
- 如何在运行时访问typescript类公共属性(调试)?只有构造函数和函数是可访问的
- 正在将构造函数函数迁移到TypeScript
- Typescript从类的构造函数调用方法
- TypeScript 构造函数类型安全
- 将数组传递给 TypeScript 中的构造函数
- 是否可以在 TypeScript 中使用构造函数作为另一个函数的参数类型
- 继承和 TypeScript 错误:X 不是构造函数类型
- TypeScript-NodeJS-意外的令牌'构造函数、函数、访问器或变量'
- 为什么这个由Typescript生成的JavaScript构造函数包装了一个立即调用的函数
- 是否可以将jQuery对象作为构造函数参数传递给typescript对象?
- TypeScript类继承构造函数混淆
- 如何从本机构造函数typescript扩展
- TypeScript:如何继承javascript构造函数
- 如何在TypeScript中从实例中获取构造函数的名称
- 如何定义一个同名的Typescript构造函数和工厂函数
- 如何访问Typescript方法中的构造函数参数
- 如何在构造函数typescript中5秒后更新作用域值