Typescript 为新的且可调用的类键入类型脚本

Typescript 为新的且可调用的类键入类型脚本,typescript,typescript-typings,typescript-definitions,Typescript,Typescript Typings,Typescript Definitions,我目前正在编辑的打字 如中所示,Duplexify可以是返回新的Duplexify实例的函数,也可以是构造函数 在中,Duplexify被视为一个接口而不是一个类,这是不正确的,但允许将其定义为函数或构造函数 是否可以同时将Duplexify定义为具有构造函数的类(因此new-able)和函数(因此可调用) 编辑:我在TypeScript的文档中找到了。如果您在“新+可调用方法”和“外部模块中的单个复杂对象”下查看,您会发现它基本上回答了我的问题,唯一的问题是,尝试实现时出现了以下错误: 实施:

我目前正在编辑的打字

如中所示,
Duplexify
可以是返回新的
Duplexify
实例的函数,也可以是构造函数

在中,
Duplexify
被视为一个接口而不是一个类,这是不正确的,但允许将其定义为函数或构造函数

是否可以同时将
Duplexify
定义为具有构造函数的类(因此
new
-able)和函数(因此可调用)

编辑:我在TypeScript的文档中找到了。如果您在“新+可调用方法”和“外部模块中的单个复杂对象”下查看,您会发现它基本上回答了我的问题,唯一的问题是,尝试实现时出现了以下错误:

实施:

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”类型


有什么想法吗?

是的,可以为可以实例化和调用的函数声明类型签名:

type实例={b:number}
类型F={(arg:string):Instance}&{new(arg:string):Instance}
类型为
F
的引用既可以实例化也可以调用:

声明常量f:f
//以下两项都将编译
(新f(“foo”).b
f(“foo”).b

是的,可以为可以实例化和调用的函数声明类型签名:

type实例={b:number}
类型F={(arg:string):Instance}&{new(arg:string):Instance}
类型为
F
的引用既可以实例化也可以调用:

声明常量f:f
//以下两项都将编译
(新f(“foo”).b
f(“foo”).b

这看起来不错,但遗憾的是它没有帮助,因为
Instance
F
interface
s,我需要
Duplexify
作为一个类。此外,它还有一个静态函数,不能包含在类之外的任何类型中,它扩展了类本身的
stream.Duplex
,因此将
Duplexify
定义为接口是没有意义的。接口和类是完全不同的宇宙。每个类都有一个类型,即TypeScript对它的表示。类本身是一个值,类型由您使用类型注释(接口,
type
声明)描述,或由类型脚本类型检查器从值表达式推断。因此,接口/类型声明总是用作类的补充(或任何其他JS值),而不是替代。我知道这一点,这正是我不能使用建议使用接口的解决方案的原因。我需要将Duplexify定义为一个类,因此
new
是可扩展的,而不是可实现的,并且它是可调用的。@AmitB。Duplexify可以定义为一个类,并使用类型声明进行描述。它们不是相互排斥的备选方案;它们是必要的补充。这似乎很好,但遗憾的是没有帮助,因为
Instance
F
interface
s,我需要
Duplexify
作为一个类。此外,它还有一个静态函数,不能包含在类之外的任何类型中,它扩展了类本身的
stream.Duplex
,因此将
Duplexify
定义为接口是没有意义的。接口和类是完全不同的宇宙。每个类都有一个类型,即TypeScript对它的表示。类本身是一个值,类型由您使用类型注释(接口,
type
声明)描述,或由类型脚本类型检查器从值表达式推断。因此,接口/类型声明总是用作类的补充(或任何其他JS值),而不是替代。我知道这一点,这正是我不能使用建议使用接口的解决方案的原因。我需要将Duplexify定义为一个类,因此
new
是可扩展的,而不是可实现的,并且它是可调用的。@AmitB。Duplexify可以定义为一个类,并使用类型声明进行描述。它们不是相互排斥的备选方案;它们是必要的补充。声明的类型作为接口而不是类并没有什么“错误”。整个TypeScript标准库都是将类构造函数声明为接口的库。没错,这并不错误,只是信息量不够。另外,将
Duplexify
声明为接口的问题是,接口不能具有Duplexify所具有的静态成员。此外,Duplexify不应该是可实现的,而是可扩展的。如果您查看标准库,它们有两个接口:一个用于实例类型,其中包含实例方法和属性,另一个用于构造函数类型,其中包含构造函数方法和静态方法和属性。但是您关于使用
扩展
而不是
实现
的观点很有趣。我不知道如何处理这个问题。我知道
接口XConstructor{new(…)}
接口X{}
定义样式,但它不适合我对这个包的定义的需要。请注意,Typescript文档现在可用。CodePlex上提供的任何文档可能至少已经过期3年了。声明的类型作为接口而不是类并没有“错误”。整个TypeScript标准库都是将类构造函数声明为接口的库。没错,这并不错误,只是信息量不够。还有,声明