如何在接口中定义构造函数签名?

时间:2015-01-05 00:06:17

标签: java c# node.js typescript

下面是关于在TypeScript接口(Javascript)中定义构造函数签名的问题,尽管最后它变得不可用。但是,这在objective-c中是可能的,并且在其他地方也可以这样做。

我有一组数据对象类,所有这些都将通过带有json字符串参数的通用构造函数来使用。当我选择TypeScript作为一个具有编译器的工具并帮助我更早地找到错误和问题时,我如何在接口中定义构造函数然后在类中实现它?

interface IParsable {

  //constructor(json : string);
  new (json : string);
}

class UserObject implements IParsable {

constructor(json : string) {

   //...
}

代码有效但编译器显示错误"错误TS2420:Class' UserObject'错误地实现了界面' IParsable'。"如果我使用"构造函数"然后我得到"来自intersface IParsable的方法构造函数未实现"。

更新:在objective-c中,可以使用两种方法创建对象:

第一种方法

UserObject *userObject = [[UserObject alloc] init]; 

对象的创建包含两种方法。 Alloc - 分配所需的内存,init是默认的构造函数名称。构造函数就像objective-c中的常规方法一样,并且有自己的名字。因此,如果您需要一个带参数的自定义构造函数,那么您只需定义一个新方法,例如initWithJson:(NSString *)json。因此,您可以在界面中定义所需的任何内容并强制执行合同。

第二种方法

UserObject *userObject = [UserObject new]; 

new是一个保留字,但它实际上执行alloc + init,你不能使用自定义构造函数。因此,推荐的方法是使用alloc + init,这样如果需要,您可以随时使用自定义构造函数方法(如alloc + initWithJson)替换它。

事实证明,即使在java或C#中也无法做到这一点。我一直认为这些语言在OOP方面更加标准和深思熟虑,尽管这一点在Objective-c中做得更好。

2 个答案:

答案 0 :(得分:1)

extends子句定义类的实例的行为,而不是构造函数。构造函数本身不是类的实例的一部分。基本上,你说的是UserObject实例(在其上调用new的结果)本身可以被调用new,事实并非如此:

var x = new UserObject();
var y = new x(); // Nonsense, of course

TypeScript中目前没有直接语法来指示构造函数UserObject与接口IParsable匹配。您可以将其用作解决方法:

class UserObject { ... }
UserObject === <IParsable>undefined;

答案 1 :(得分:1)

TypeScript是结构化类型,因此您可以获得所需的所有检查,而无需在类上使用implements关键字。

在下面的示例中,检查传递给IParsable的构造函数的参数(在example函数内)。您也不能将参数传递给不满足example接口的IParsable函数,即它必须接受字符串参数(或根本不接受参数)。

我强调了编译器将捕获的三个错误。

interface IParsable {
    new (json: string);
}

class ExampleOne {
    constructor(json: string) {

    }
}

class ExampleTwo {
    constructor(json: string) {

    }
}

class ExampleThree {
    constructor(arg: number) {

    }
}

function example(obj: IParsable) {
    // Error - doesn't pass string arg
    //return new obj();

    // Error - wrong argument type
    //return new obj(1);

    return new obj('{ a: "b"}');

}

example(ExampleOne);
example(ExampleTwo);

// Error - Doesn't satisfy IParsable
//example(ExampleThree);