TypeScript打字类,适用于新的和可调用的类

时间:2017-10-24 22:58:58

标签: typescript typescript-typings typescript-definitions

我正在编辑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”类型。

有什么想法吗?

1 个答案:

答案 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