Typescript 有没有从父类继承参数的方法';谁的构造函数?

Typescript 有没有从父类继承参数的方法';谁的构造函数?,typescript,constructor,super,Typescript,Constructor,Super,我遇到的问题是,我有一些基本(泛型)类,它们的属性是通过类的构造函数初始化的。然后,当我要扩展这个类来创建一个更具体的类时,我必须重新键入基类的构造函数具有的相同参数,这样我才能将它们传递给super。如果您想象一个非常通用的类,它有许多属性,这些属性是通过构造函数初始化的,并且经常被扩展,每次都必须不断地重新键入所有这些属性以便将它们传递给super,这似乎效率低下。我可能错过了一些常见的预防方法。有什么办法可以提高效率吗?也许通过某种方式“继承”父类的构造函数参数 这是一个代码示例,您可以看

我遇到的问题是,我有一些基本(泛型)类,它们的属性是通过类的构造函数初始化的。然后,当我要扩展这个类来创建一个更具体的类时,我必须重新键入基类的构造函数具有的相同参数,这样我才能将它们传递给super。如果您想象一个非常通用的类,它有许多属性,这些属性是通过构造函数初始化的,并且经常被扩展,每次都必须不断地重新键入所有这些属性以便将它们传递给super,这似乎效率低下。我可能错过了一些常见的预防方法。有什么办法可以提高效率吗?也许通过某种方式“继承”父类的构造函数参数

这是一个代码示例,您可以看到,在
程序员的构造函数中,我必须再次键入
名称
年龄
,和
高度
,以便将其传递给
超级

班级人员{
名称:字符串;
年龄:人数;
高度:数字;
构造函数(名称:字符串、年龄:数字、高度:数字){
this.name=名称;
这个。年龄=年龄;
高度=高度;
}
}
类程序员扩展了Person{
语言:字符串[];
构造函数(名称:字符串、年龄:数字、高度:数字、语言:字符串[]){
超级(姓名、年龄、身高);
这个。语言=语言;
}
}

由于
Person
是基类,如果没有
名称
年龄
身高
,则无法初始化该基类,因此扩展类
程序员
必须使用相同的构造函数参数

正如您在有许多参数的情况下所提到的,您可以使用创建模式(如生成器模式)来创建扩展类的对象

如果不需要参数构造函数,可以将超级构造函数参数设置为可选参数

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;
  }
}

您不能继承,但您可以使用
ContractorParameters
引用参数,并且可以在派生构造函数中展开它们,只要您不介意在前面添加任何新参数:

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  
班级人员{
名称:字符串;
年龄:人数;
高度:数字;
构造函数(名称:字符串、年龄:数字、高度:数字){
this.name=名称;
这个。年龄=年龄;
高度=高度;
}
}
类程序员扩展了Person{
语言:字符串[];
构造函数(语言:字符串[],…p:ConstructorParameters){
超级(…p);
这个。语言=语言;
}
}
新程序员([“A”],“”,1,1)//从3.4开始,您将在IntelliSense中获得实际的参数名,而不仅仅是…p

不过,我不确定这是否是最好的设计,如果您有很多参数,那么最好定义一个接口并将其传入。或者使用某种类型的映射类型来提取相关字段。

如果这些参数是实例化程序员实例的可选字段,则可以为其设置默认值。程序员是个人,因此他有姓名、年龄和其他字段,因此在创建类时假定该参数已初始化。使什么是可选的,并根据什么是必要的创建程序员实例。这应该如何工作,特别是与
this.languages=languages?谢谢,这很有用:)如果将来有人好奇,你可以用短语“rest参数”总结我的问题的解决方案。不能编辑以前的评论,但我应该说“spread operator”而不是“rest参数”。