Что эквивалентно защищенной в TypeScript?
Мне нужно добавить некоторые переменные-члены в базовый класс, который будет использоваться только в производных классах.
Что эквивалентно защищенной в TypeScript?
Мне нужно добавить некоторые переменные-члены в базовый класс, который будет использоваться только в производных классах.
12 ноября 2014 года. Версия 1.3 из TypeScript доступна и включает в себя защищенное ключевое слово.
26 сентября 2014 года. Ключевое слово protected
приземлилось. В настоящее время это предварительный выпуск. Если вы используете очень новую версию TypeScript, теперь вы можете использовать ключевое слово protected
... ответ ниже для более старых версий TypeScript. Наслаждайтесь.
Просмотр примечаний к выпуску для защищенного ключевого слова
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;
}
}
Как насчет следующего подхода:
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
определяется как общедоступная, это будет работать:
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.
Вы также можете обернуть его в модуль при экспорте только интерфейса, а затем из других экспортированных методов вы можете вернуть экземпляры (factory), таким образом, общий объем переменных будет "содержаться" в модуле.
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.
Я знаю, что это не совсем то, что вы просили, но это довольно близко.
по крайней мере в данный момент (версия 0.9) защищены, не указаны в спецификациях
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf