Jaki jest odpowiednik chroniony w TypeScript?Jaki jest odpowiednik chroniony w TypeScript?
muszę dodać kilka zmiennych składowych w klasie bazowej być stosowane tylko w klas pochodnych.
Jaki jest odpowiednik chroniony w TypeScript?Jaki jest odpowiednik chroniony w TypeScript?
muszę dodać kilka zmiennych składowych w klasie bazowej być stosowane tylko w klas pochodnych.
12 listopada 2014 roku wersja 1.3 maszynopis jest dostępny i zawiera chronioną słowa kluczowego.
26 września 2014 r. Słowo kluczowe protected
wylądowało. Obecnie jest w fazie przedpremierowej. Jeśli używasz bardzo nowej wersji TypeScript, możesz teraz użyć słowa kluczowego protected
... odpowiedź poniżej dotyczy starszych wersji TypeScript. Cieszyć się.
View the release notes for the protected keyword
class A {
protected x: string = 'a';
}
class B extends A {
method() {
return this.x;
}
}
maszynopis ma tylko private
- nie chroniony, a to oznacza tylko prywatny podczas kompilacji kontroli. Aby uzyskać dostęp do super.property
, musi on być publiczny.
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;
}
}
Jak o następującym podejściu:
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;
}
}
Ponieważ zmienna num
jest zdefiniowane jako publiczne, to będzie działać:
var b = new B(4);
b.num;
Ale ponieważ to nie jest zdefiniowane w interfejsie, to :
var b: MyType = new B(4);
b.num;
spowoduje The property 'num' does not exist on value of type 'MyType'
.
Możesz spróbować tego w tym playground.
Można również zawinąć go w moduł podczas eksportowania tylko interfejsu, a następnie z innych wyeksportowanych metod można zwrócić instancje (fabryczne), w ten sposób publiczny zakres zmiennych zostanie "zawarty" w module.
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'
Zmodyfikowana wersja tej playground.
Wiem, że nie jest to dokładnie to, o co prosiłeś, ale jest całkiem blisko.
przynajmniej w tym momencie (wersja 0.9) chronione nie są wymienione w specyfikacji
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf
Możesz głosować tę Codeplex problem: http://typescript.codeplex.com/workitem/125 –
Zaktualizowałem swoją odpowiedź, aby odzwierciedlić fakt, że 'protected' wylądował: https://github.com/Microsoft/TypeScript/pull/688 – Fenton