TypeScript 中受保护的等效内容是什么?
我需要在基类中添加一些成员变量,仅用于派生类。
答案 0 :(得分:49)
2014年11月12日.TypeScript版本1.3可用,并包含受保护的关键字。
2014年9月26日。protected
关键字已落地。它目前正在发布。如果您使用的是新版本的TypeScript,现在可以使用protected
关键字...以下答案适用于旧版本的TypeScript。享受。
View the release notes for the protected keyword
class A {
protected x: string = 'a';
}
class B extends A {
method() {
return this.x;
}
}
TypeScript只有private
- 没有受到保护,这只在编译时检查时表示私有。
如果您想访问super.property
,则必须公开。
class A {
// Setting this to private will cause class B to have a compile error
public x: string = 'a';
}
class B extends A {
method() {
return super.x;
}
}
答案 1 :(得分:4)
以下方法如何:
interface MyType {
doit(): number;
}
class A implements MyType {
public num: number;
doit() {
return this.num;
}
}
class B extends A {
constructor(private times: number) {
super();
}
doit() {
return super.num * this.times;
}
}
由于num
变量被定义为public,因此可以使用:
var b = new B(4);
b.num;
但是因为它没有在界面中定义,所以:
var b: MyType = new B(4);
b.num;
将导致The property 'num' does not exist on value of type 'MyType'
您可以在此playground中尝试。
您也可以在仅导出接口时将其包装在模块中,然后从其他导出的方法中返回实例(工厂),这样变量的公共范围将“包含”在模块中。 />
module MyModule {
export interface MyType {
doit(): number;
}
class A implements MyType {
public num: number;
doit() {
return this.num;
}
}
class B extends A {
constructor(private times: number) {
super();
}
doit() {
return super.num * this.times;
}
}
export function factory(value?: number): MyType {
return value != null ? new B(value) : new A();
}
}
var b: MyModule.MyType = MyModule.factory(4);
b.num; /// The property 'num' does not exist on value of type 'MyType'
此playground中的修改版本。
我知道这不完全是你所要求的,但它非常接近。
答案 2 :(得分:1)
至少目前(版本0.9)受保护的内容未在规范中提及
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf