与构造签名的接口如何工作?

问题描述 投票:135回答:5

我在确定接口中定义构造函数的工作方式时遇到了一些麻烦。我可能完全误会了一些东西。但是我已经搜索了很长时间了,但找不到任何与此相关的内容。

如何在TypeScript类中实现以下接口:

interface MyInterface {
    new ( ... ) : MyInterface;
}

Anders Hejlsberg创建了一个界面,其中包含与此video中类似的内容(大约14分钟)。但是对于我的一生,我无法在课堂上实现。

我可能误会了什么,我没有得到什么?

编辑:

进行澄清。 “新(...)”的意思是“任何东西”。我的问题是我什至无法获得此工作的最基本版本:

interface MyInterface {
    new () : MyInterface;
}

class test implements MyInterface {
    constructor () { }
}

这对我来说不是编译的,我得到了“类'test'声明了接口'MyInterface'但没有实现:类型'MyInterface'需要构造签名,但是类型'test'缺少一个签名”。] >

编辑:

因此,在进行了研究之后,给出了更多反馈。

interface MyInterface {
    new () : MyInterface;
}

class test implements MyInterface {
    constructor () => test { return this; }
}

不是有效的TypeScript,但这不能解决问题。您不能定义构造函数的返回类型。它将返回“测试”。签名如下:课堂测试{构造函数(){}}似乎是“ new()=> test”(通过将在线代码悬停在“类”上,只需粘贴该代码即可获得)。这就是我们想要的,也是我的期望。

任何人都可以在实际编译时提供此示例或类似示例吗?

再次编辑(...):

所以我可能想出了为什么可以在接口中定义它却不能在TypeScript类中实现的想法。以下工作:

var MyClass = (function () {
    function MyClass() { }
    return MyClass;
})();

interface MyInterface {
    new () : MyInterface;
}

var testFunction = (foo: MyInterface) : void =>  { }
var bar = new MyClass();
testFunction(bar);

所以这只是TypeScript的一项功能,可让您连接javascript吗?还是可以在TypeScript中实现它而不必使用javascript实现类?

我在确定接口中定义构造函数的工作方式时遇到了一些麻烦。我可能完全误会了一些东西。但是我已经搜索了很长时间了,但是找不到...

typescript constructor interface
5个回答
139
投票

接口中的构造签名不能在类中实现;它们仅用于定义现有的JS API,这些API定义了可启用“新”功能。这是一个涉及有效的接口new签名的示例:


54
投票

在搜索完全相同的问题时,我去寻找TypeScript团队是如何做到的...


5
投票

具有构造签名的接口并不意味着任何类都可以实现(乍一看,对于像我这样具有C#/ Java背景的人来说,这看起来很奇怪,但是给了机会)。稍有不同。


3
投票

从设计的角度来看,通常在接口中指定构造函数的要求。该界面应描述您可以在对象上执行的操作。如果需要,实现接口的不同类应允许要求不同的构造函数参数。


2
投票

为了达到预期的行为,您可以使用Interfaces with construct signatures not type checking,即使这可能不是它们应被使用的。

© www.soinside.com 2019 - 2024. All rights reserved.