【问题标题】:super and property inheritance in TypeScriptTypeScript 中的 super 和属性继承
【发布时间】:2021-02-06 08:31:05
【问题描述】:

我创建了一个USer 类并创建了一个子类ADmin

class USer {

    constructor(public name: string, public employees: string[]) {  // wieso dann hier nochmal type zuordnen dachte das wäre das gleiche oder ?
      }
       login(this: User){   
     
      }
  

}

class ADmin extends USer {

    constructor(name: string, employes: string[], public admin: string){
        super(name, employes); // calls the constructor of the USer !
    }


}



据我了解super()调用USer的构造函数,所以所有属性都继承到子类。

如果我不声明我得到的属性类型

Argument of type 'void' is not assignable to parameter of type 'string'

为什么我需要在ADmin 类中再次声明属性的类型?不应该把类型转给ADmin吗?

【问题讨论】:

  • 您不需要,但在这种情况下,您需要参数,以便可以将其传递给父级...但是您可以拥有任何类型的构造函数参数。这样的定义可以是constructor(public admin: string){ super("James", ["Sarah", "John"]);}
  • 对不起,我不明白你的解释,我编辑了我的问题以便澄清

标签: typescript inheritance


【解决方案1】:

构造函数中的类型做了两件事:

  1. 它们声明传递给构造函数的参数的类型
  2. 他们声明类的实例变量的类型

#1 是所有constructor 函数的要求。 #2 只是让你的生活更轻松的捷径,只有当你在变量前使用像public 这样的修饰符时才会发生。

当您声明class Admin extends User 时,Admin 继承了#2 的所有类型。它知道Admin 实例必须有nameemployees。它确实从 #1 继承类型。

Adminconstructor 的唯一规则是它必须使用参数(string, string[]) 调用super(name, employees)。它不需要遵循与User 构造函数相同的格式。它可以以不同的顺序接受参数,使用任意数量的任意类型的参数来派生nameemployees,甚至可以接受零参数并使用一些预定义的常量调用super

这里有一些愚蠢的构造函数示例,它们都是有效的

constructor(name: string[]){
  super(name[0], []); // derive name, create employees
}
constructor(object: {name: string, employees: string[]}){
    super(object.name, object.employees); // derive name & employees
}
constructor(){
    super("The Admin", []); // create name & employees
}
constructor(name: string[], employees: string){
    super(employees, name); // TERRIBLE code with backwards variables
}

最后一个(这是你永远不应该编写的糟糕代码)是为了证明你可以拥有相同的变量 nameemployeesUser 构造函数的顺序相同,并且不共享相同的类型.这就是为什么 #1 类型不被继承的原因。

总结一下:

据我了解super()调用USer的构造函数,所以所有属性都继承到子类。

这是正确的。

为什么我需要在 ADmin 类中再次声明属性的类型?不应该将类型转移到 ADmin 吗?

您没有声明属性的类型。您正在为 constructor 函数声明函数参数的类型。

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 2022-12-18
    • 2019-05-15
    • 2016-02-11
    • 2017-08-10
    • 1970-01-01
    • 2017-10-24
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多