从外部类访问内部类的成员 - TypeScript

时间:2017-11-29 12:57:53

标签: class typescript namespaces inner-classes

我正在尝试在TypeScript中对某个类的某些成员进行分组。考虑以下课程:

export class MyClass {

  private member: string = 'foo';

  public getFoo(): string {

    this._doSomething();

    return this.member;

  }

  // Helper
  _doSomething() { console.log(this.member); }

}

我基本上想要做的是用命名空间包裹_doSomething(让我们调用命名空间helpers),以便在getFoo()内我可以调用this.helpers._doSomething()

当然,这在Javascript中非常容易,因为我们可以将对象定义为成员并在对象内定义辅助函数。

在TypeScript中,我几乎通过类表达式获得相同的效果:

export class MyClass {

  private member: string = 'foo';

  public getFoo(): string {

    this.helpers._doSomething();

    return this.member;

  }

  private helpers = class {

    // To have access to the parent's members
    constructor(private parent: MyClass) { }

    public _doSomething() { console.log(this.parent.member); }

  };

}

唯一的问题是MyClass无法访问helpers班级成员。

如何从外部类访问内部类成员?

是否有更好的方法来实现命名空间helpers

任何帮助都将不胜感激。

更新

使用接受的答案实现了目标:

export class MyClass {

  private member: string = 'foo';

  public getFoo(): string {

    this.helpers._doSomething();

    return this.member;

  }

  private helpers = new (class {

    // To have access to the parent's members
    constructor(private parent: MyClass) { }

    public _doSomething() { console.log(this.parent.member); }

  })(this);

}

1 个答案:

答案 0 :(得分:2)

您刚刚定义了这个类,可以访问您必须创建的非静态成员。你可以这样内联:

export class MyClass {

  private member: string = 'foo';

  public getFoo(): string {

    this.helpers._doSomething();

    return this.member;

  }

  private helpers = new (class {

    // To have access to the parent's members
    constructor(private parent: MyClass) { }

    public _doSomething() { console.log(this.parent.member); }

  })(this);

}

或者,如果您想拥有多个辅助类实例,可以根据需要进行修改:

public getFoo(): string {

  let h = new this.helpers(this);
  let h1 = new this.helpers(this);
  h._doSomething();
  h1._doSomething();
  return this.member;

}

您可以通过使用类和命名空间的合并来实现类似的效果,问题是您无法访问私有成员,而您的解决方案需要这样:

export class MyClass {
  // Must be public for access from helper
  public member: string = 'foo';

  public getFoo(): string {
    let h = new MyClass.helpers(this);
    h._doSomething();
    return this.member;
  }
}

export namespace MyClass {
  // must be exported to be accesible from the class
  export class helpers {
    // To have access to the parent's members
    constructor(private parent: MyClass) { }
    public _doSomething() { console.log(this.parent.member); }
  }
}