我遇到的问题是我有一些基类(泛型),它们的属性是通过类的构造函数初始化的。然后,当我扩展此类以创建更特定的类时,必须重新键入与基类的构造函数相同的参数,以便将它们传递给super。如果您想象一个非常通用的类,它具有许多通过构造函数初始化的属性,并且经常扩展,那么每次必须不断重新键入所有这些属性以将它们传递给super似乎效率很低。我可能会缺少一些防止这种情况的常见方法。有什么想法可以提高效率吗?也许通过某种方式“继承”父类的构造函数参数?
这是一个代码示例,如您所见,在Programmer
的构造函数中,我必须再次重新键入name
,age
和height
只是将其传递给super
:
class Person {
name: string;
age: number;
height: number;
constructor(name: string, age: number, height: number) {
this.name = name;
this.age = age;
this.height = height;
}
}
class Programmer extends Person {
languages: string[];
constructor(name: string, age: number, height: number, languages: string[]) {
super(name, age, height);
this.languages = languages;
}
}
答案 0 :(得分:4)
您不能继承,但是可以使用ContructorParameters
来引用该参数,并且可以将它们散布在派生的构造函数中,只要您不介意在前面添加任何新参数即可:< / p>
class Person {
name: string;
age: number;
height: number;
constructor(name: string, age: number, height: number) {
this.name = name;
this.age = age;
this.height = height;
}
}
class Programmer extends Person {
languages: string[];
constructor(languages: string[], ...p: ConstructorParameters<typeof Person>) {
super(...p);
this.languages = languages;
}
}
new Programmer(["A"], "", 1, 1) // Since 3.4 you will get actual parameter names in intelisense not just ...p
虽然不确定这是最好的设计,但是如果您有很多参数,则最好定义一个接口并将其传入。或使用某种映射类型提取相关字段。
答案 1 :(得分:1)
由于Person
是基类,没有name
,age
和height
就无法初始化,因此扩展类Programmer
将强制需要相同的构造函数args。
如前所述,如果有很多参数,则可以使用创建模式(如构建器模式)来创建扩展类的对象。
如果您不希望使用arg构造函数,则可以将super构造函数参数设为可选。
class Person {
name: string;
age: number;
height: number;
constructor(name?: string, age?: number, height?: number) {
this.name = name;
this.age = age;
this.height = height;
}
}
class Programmer extends Person {
languages: string[];
constructor(languages: string[]) {
super();
this.languages = languages;
}
}