如果您查看代码的已编译 javascript,就会更容易理解为什么不能这样做:
var OuterClass = (function () {
function OuterClass() {
this.outerField = 1337;
this.InnerClass = (function () {
function class_1() {
}
class_1.prototype.accessOuter = function () {
return this.outerField; // outerField not defined
};
return class_1;
}());
}
return OuterClass;
}());
如您所见,outerField 被定义为OuterClass 的成员,如下所示:
this.outerField = 1337;
当您尝试在 InnerClass 中访问它时:
return this.outerField;
但这里的this 是class_1 的实例,而不是OuterClass,所以this 中没有outerField。
此外,您无法从内部类访问外部类的实例。
这个在java中的解决方式是这样的:
class OuterClass {
private int outerField = 1337;
public class InnerClass {
public int accessOuter() {
return OuterClass.this.outerField;
}
}
}
但 typescript/javascript 中没有与 OuterClass.this.outerField 等效的内容。
看看 typescript 内部类更像 java 中的静态内部类,但在这里你也只能访问公共属性:
class OuterClass {
public static outerField = 1337; // has to be public
public InnerClass = class {
public accessOuter() {
return OuterClass.outerField;
}
}
}
您可以将外部类的实例传递给内部类:
class OuterClass {
public outerField = 1337;
public InnerClass = class {
constructor(private parent: OuterClass) {}
public accessOuter() {
return this.parent.outerField;
}
}
}
但同样,您需要公开outerField。
编辑
如果你想实现一些模拟所需行为的东西(也就是说,内部类实例可以访问私有的外部类成员),那么你可以这样做:
interface OuterClassProxy {
outerField: number;
}
interface IInnerClass {}
class OuterClass {
private outerField = 1337;
static InnerClass = class implements IInnerClass {
constructor(private parent: OuterClassProxy) {}
public accessOuter() {
return this.parent.outerField;
}
}
public createInnerClass(): IInnerClass {
let outerClassInstance = this;
return new OuterClass.InnerClass({
get outerField(): number {
return outerClassInstance.outerField;
},
set outerField(value: number) {
outerClassInstance.outerField = value;
}
});
}
}
这是相当多的工作,但它会做到的。