listas - typescript types
¿Cuál es el equivalente de protegido en TypeScript? (3)
¿Cuál es el equivalente de protegido en TypeScript ?
Necesito agregar algunas variables miembro en la clase base para usar solo en clases derivadas .
Actualizaciones
12 de noviembre de 2014. La versión 1.3 de TypeScript está disponible e incluye la palabra clave protegida.
26 de septiembre de 2014. La palabra clave protected
ha aterrizado. Actualmente es prelanzamiento. Si está utilizando una versión muy nueva de TypeScript, ahora puede usar la palabra clave protected
... la respuesta a continuación es para versiones anteriores de TypeScript. Disfrutar.
github.com/Microsoft/TypeScript/pull/688
class A {
protected x: string = ''a'';
}
class B extends A {
method() {
return this.x;
}
}
Vieja respuesta
TypeScript solo tiene privacidad, no está protegido y esto solo significa privado durante la verificación en tiempo de compilación.
Si quieres acceder a super.property
, tiene que ser público.
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;
}
}
¿Qué tal el siguiente enfoque?
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;
}
}
Dado que la variable num
se define como pública, esto funcionará:
var b = new B(4);
b.num;
Pero como no está definido en la interfaz, esto:
var b: MyType = new B(4);
b.num;
dará como resultado The property ''num'' does not exist on value of type ''MyType''
.
Puedes probarlo en este playground .
También puede envolverlo en un módulo mientras exporta solo la interfaz, luego, desde otros métodos exportados puede devolver las instancias (fábrica), de esa manera el alcance público de las variables estará "contenido" en el módulo.
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''
Versión modificada en este playground .
Sé que no es exactamente lo que pediste, pero está bastante cerca.
al menos en este momento (versión 0.9) protegidos no se mencionan en las especificaciones
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf