如何将超级的类型分配给子构造函数

Posted

技术标签:

【中文标题】如何将超级的类型分配给子构造函数【英文标题】:how do I assign the typing of a super to the child constructor 【发布时间】:2021-11-12 03:15:08 【问题描述】:

我正在寻找一种将父构造函数参数的类型传递给子构造函数的方法,例如

class B extends A     
    constructor (input) 
        super(input);
    

我试过了

class B extends A     
    constructor (input : ConstructorParameters<typeof super>) 
        super(input);
    

但是我从 eslint 'super' is not defined. 得到一个错误

【问题讨论】:

【参考方案1】:

我认为您必须将 ConstructorParameters&lt;typeof A&gt;[0] 作为构造函数参数类型传递。

class A 
  title: string;
  constructor(title: string) 
    this.title = title;
  


class B extends A 
  constructor(title: ConstructorParameters<typeof A>[0]) 
    super(title);
  

您可以尝试在评论中建议的其他解决方案:

  constructor(title: ConstructorParameters<typeof A>) 
    super(...title);
  

【讨论】:

您也可以使用扩展运算符,这是更通用的解决方案。 Example 传播参数可能对用户更友好constructor(...input: ConstructorParameters&lt;typeof A&gt;)。我们可以用new B(1) 代替new B([1])【参考方案2】:

如果您不更改扩展类中的构造函数签名,那么就开发人员体验而言,这是 TypeScript 真正大放异彩的地方:您甚至不需要将构造函数包含在您的扩展课程,因为 TS 为您完成!

TS Playground

class A 
  input: string;
  constructor(input: string) 
    this.input = input;
  


class B extends A 

new B(); /* Error
^^^^^^^
Expected 1 arguments, but got 0.(2554) */

new B('myInput'); // ok

【讨论】:

以上是关于如何将超级的类型分配给子构造函数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript高级之继承

JavaScript学习手册(58)

继承模式

如何:安全地调用具有不同参数的超级构造函数

java 中使用jmx对tomcat实时监控默认的构造方法无法处理的异常类型的隐式超级构造函数抛出异常

为啥我必须将道具传递给构造函数和超级[重复]