有没有办法从父 class 的构造函数继承参数?

Is there a way to inherit parameters from a parent class's constructor?

我遇到的问题是我有一些基础(通用)classes,其属性是通过 class 的构造函数初始化的。然后当我去扩展这个 class 来创建一个更具体的 class 时,我必须重新输入与基础 class 的构造函数相同的参数,这样我就可以传递它们超级。如果您想象一个非常通用的 class 具有许多通过构造函数初始化的属性,并且经常被扩展,那么每次都必须不断地重新键入所有这些属性只是为了将它们传递给 super 似乎效率低下。我可能缺少一些防止这种情况的常用方法。有什么想法可以提高效率吗?也许通过某种方式 "inheriting" 父 class 的构造函数参数?

这是一个代码示例,如您所见,在 Programmer 的构造函数中,我必须重新键入 nameageheight 再次将其传递给 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;
    }
}

由于 Person 是基础 class,没有 nameageheight 就无法初始化,扩展的 class Programmer 将强制需要相同的构造函数参数。

正如您提到的,如果有很多参数,您可以使用创建模式(如构建器模式)创建扩展对象 class。

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

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

你不能继承,但你可以使用 ContructorParameters 引用参数,你可以将它们散布到派生构造函数中,只要你不介意在前面添加任何新参数:

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  

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