鉴于此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参数是否也必须公开?我有什么工作,但我只想检查这是否正确/接受/正确/传统。
答案 0 :(得分:1)
问:Employee的firstName和lastName参数是否也必须公开?
答:除非您需要,否则firstName
和lastName
不需要公开。
基本上,您的问题是关于构造函数参数修饰符的作用,或者"变量范围":
因此,选择使用修饰符和修饰符实际上取决于您希望参数具有的范围。
您应阅读的一些参考文献:
答案 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
实例具有相等的foo
和bar
属性:
class Foo {
public constructor (public foo: string) {}
}
class Bar extends {
public constructor (public bar: string, public baz) {
super(bar);
}
}