我正在编辑Duplexify的打字。
正如您在Duplexify's source code中所看到的,Duplexify
可以是返回新Duplexify
实例的函数,也可以是构造函数。
在Duplexify's current typings中,Duplexify
被认为是一个接口而不是一个类,这是不正确的,但可以将其定义为函数或构造函数。
是否可以将Duplexify
定义为具有构造函数的类(因此new
- 能够)并且同时作为函数(因此可调用)?
编辑:我在TypeScript的文档中找到了the following article。如果您查看“新建+可调用方法”和“外部模块中的单一复杂对象”,您会发现它几乎回答了我的问题,唯一的问题是尝试实现我有以下错误:
实现:
import * as stream from "stream";
declare function Duplexify(writable?: stream.Writable, readable?: stream.Readable, streamOptions?: stream.DuplexOptions): Duplexify;
declare module Duplexify {
var obj: (writable?: stream.Writable, readable?: stream.Readable, streamOptions?: stream.DuplexOptions) => Duplexify;
}
interface Duplexify extends stream.Duplex {
new(writable?: stream.Writable, readable?: stream.Readable, streamOptions?: stream.DuplexOptions): Duplexify;
readonly destroyed: boolean;
setWritable(writable: stream.Writable): void;
setReadable(readable: stream.Readable): void;
destroy(): void;
}
export = Duplexify;
用法:
import { Duplexify } from 'duplexify';
const d: Duplexify = new Duplexify(); // errors
错误是:
[ts]只能使用'new'关键字调用void函数。
和
[ts]'new'表达式,其目标缺少构造签名,隐式具有“any”类型。
有什么想法吗?
答案 0 :(得分:2)
是的,可以为可以实例化和调用的函数声明类型签名:
type Instance = { b: number }
type F = { (arg: string): Instance } & { new (arg: string): Instance }
类型F
的引用既可以实例化也可以调用:
declare const f: F
// Both of the following will compile
(new f("foo")).b
f("foo").b