【问题标题】:What is the proper way to overload a constructor in typescript?在打字稿中重载构造函数的正确方法是什么?
【发布时间】:2018-04-24 10:38:22
【问题描述】:

鉴于这个 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 参数也必须声明为 public 吗?我有什么工作,但我只想检查这是否正确/接受/适当/常规。

【问题讨论】:

  • 我不是 TS 专家,但这对我来说看起来不错... fn 和 ln 已经在超类中声明为 public 不需要这个,如果不好,TS 会直接打到你脸上 ;-) 这就是它存在的原因 :-)
  • Thnaks @Legends

标签: typescript


【解决方案1】:

问:Employee 的 firstName 和 lastName 参数也必须声明为 public 吗? 答:firstNamelastName 不需要公开,除非您需要公开。

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

  • 构造函数中不带修饰符的参数范围仅在构造函数中可见。
  • 带有修饰符(private/protected/public)的参数范围将是具有相同修饰符的“类属性”。例如,请参阅下面的参考链接。

因此,是否使用修饰符以及使用哪个修饰符的选择实际上取决于您希望参数具有什么范围。

您应该阅读的一些参考资料:

【讨论】:

    【解决方案2】:

    该示例显示了执行此操作的正确方法。子构造函数可能具有不同的签名,但应使用正确的参数调用 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 2015-08-29
      相关资源
      最近更新 更多