给定此打字稿类:
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);
}
}
,但我不确定这是构造函数的正确声明,尤其是在默认属性方面。
雇员的名称和姓氏参数是否也必须公开?我有效的工作,但我只想检查一下这是否正确/接受/适当/常规。
q:firstname和lastname参数是否也必须公开声明?答:firstName
和lastName
除非需要,否则不需要公开。
基本上,您的问题是关于构造函数参数修饰符的作用,或"变量范围":
- 在构造函数函数中仅可见构造函数中没有修饰符的参数范围。
- 带有修饰符(私有/保护/public(参数的范围将是具有相同修饰符的"类属性"。请参阅下面的引用链接。
因此,选择是否使用修饰符的选择以及哪种修饰符确实取决于您希望参数具有的范围。
您应该阅读的一些参考文献:
-
https://www.typescriptlang.org/docs/handbook/classes.html
-
https://www.stevefenton.co.uk/2013/04/stop-manaly-assigning-typescript-constructor-parameter-parameters/
该示例显示了正确的方法。儿童构造函数可能具有不同的签名,但应使用正确的论点调用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);
}
}