下面是关于在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中做得更好。
答案 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);