从外部 class 访问内部 class 的成员 - TypeScript
Access members of inner class from the outer class - TypeScript
我正在尝试在 TypeScript 中对 class 的一些成员进行分组。考虑以下 class:
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 中,我通过 class 表达式几乎得到了相同的效果:
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
class 成员。
如何从外部 class 访问内部 class 成员?
有没有更好的方法实现命名空间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);
}
您刚刚定义了 class,要访问您必须新建的非静态成员。您可以像这样内联执行此操作:
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);
}
或者,如果您想要多个助手实例 class,您可以根据需要对其进行更新:
public getFoo(): string {
let h = new this.helpers(this);
let h1 = new this.helpers(this);
h._doSomething();
h1._doSomething();
return this.member;
}
您可以通过合并 class 和命名空间来实现类似的效果,问题是您将无法访问私有成员,而您的解决方案需要这样:
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); }
}
}
我正在尝试在 TypeScript 中对 class 的一些成员进行分组。考虑以下 class:
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 中,我通过 class 表达式几乎得到了相同的效果:
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
class 成员。
如何从外部 class 访问内部 class 成员?
有没有更好的方法实现命名空间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);
}
您刚刚定义了 class,要访问您必须新建的非静态成员。您可以像这样内联执行此操作:
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);
}
或者,如果您想要多个助手实例 class,您可以根据需要对其进行更新:
public getFoo(): string {
let h = new this.helpers(this);
let h1 = new this.helpers(this);
h._doSomething();
h1._doSomething();
return this.member;
}
您可以通过合并 class 和命名空间来实现类似的效果,问题是您将无法访问私有成员,而您的解决方案需要这样:
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); }
}
}