在typescript中重载构造函数的正确方法是什么?

时间:2018-04-23 23:17:37

标签: typescript

鉴于此TypeScript类:



export class Person {
    
    public constructor (public firstName: string, public lastName: string) {
    }

    public fullName(): string {
        return `${this.firstName} ${this.lastName}`;
    }

    public WriteInfo() {
        console.log(this.fullName());
    }
}




在后代类中覆盖构造函数的正确方法是什么?

我有:



import { Person } from './class';

export  class Employee extends Person {
    public constructor (afirstName: string, alastName: string, public Salary: number) {
      super(afirstName, alastName);   
    }    

    public WriteInfo() {
        let s: string = `${this.fullName()} makes this much: -- $${this.Salary}`;
        console.log(s);
    }
}




但我不确定这是构造函数的正确声明,特别是关于默认属性。

Employee的firstName和lastName参数是否也必须公开?我有什么工作,但我只想检查这是否正确/接受/正确/传统。

2 个答案:

答案 0 :(得分:1)

问:Employee的firstName和lastName参数是否也必须公开? 答:除非您需要,否则firstNamelastName不需要公开。

基本上,您的问题是关于构造函数参数修饰符的作用,或者"变量范围":

  • 构造函数中没有修饰符的参数范围仅在构造函数中可见。
  • 带修饰符的参数范围(私有/受保护/公共)将是"类属性"使用相同的修饰符。例如,请参阅下面引用的链接。

因此,选择使用修饰符和修饰符实际上取决于您希望参数具有的范围。

您应阅读的一些参考文献:

答案 1 :(得分:1)

该示例显示了正确的方法。子构造函数可能具有不同的签名,但应使用正确的参数调用super

子构造函数不需要与父构造函数中相同参数的可见性修饰符,这将导致分配this.foo = foo两次:

class Foo {
    public constructor (public foo: string) {}
}

class Bar extends {
    public constructor (public foo: string) {
      super(foo);
    }
}

不需要使用可见性修饰符来更改可见性,因为这不受支持:

class Foo {
    public constructor (public foo: string) {}
}

class Bar extends {
    // error
    public constructor (protected foo: string) {
      super(foo);
    }
}
如果子类具有不同的参数名称并且需要为属性创建别名,则可能需要

可见性修饰符,这将导致Bar实例具有相等的foobar属性:

class Foo {
    public constructor (public foo: string) {}
}

class Bar extends {
    public constructor (public bar: string, public baz) {
      super(bar);
    }
}
相关问题