what uso usar porque poo interfaz interfaces ejemplos definicion atributos interface get set accessor typescript

uso - usar interface c#



¿Es posible usar getters/setters en la definición de interfaz? (3)

Por el momento, TypeScript no permite el uso de métodos get / set (accesores) en las interfaces. Por ejemplo:

interface I { get name():string; } class C implements I { get name():string { return null; } }

además, TypeScript no permite el uso de expresiones de funciones de matriz en métodos de clase: por ejemplo:

class C { private _name:string; get name():string => this._name; }

¿Hay alguna otra forma en que pueda usar un getter y un setter en una definición de interfaz?


En primer lugar, Typescript solo admite la sintaxis get y set cuando se dirige a Ecmascript 5. Para lograr esto, debe llamar al compilador con

tsc --target ES5

Las interfaces no admiten getters y setters. Para obtener su código para compilar, debería cambiarlo a

interface I { getName():string; } class C implements I { getName():string { return null; } }

Qué texto mecanografiado soporta es una sintaxis especial para campos en constructores. En tu caso, podrías tener

interface I { getName():string; } class C implements I { constructor(public name: string) { } getName():string { return name; } }

Observe cómo la clase C no especifica el name campo. En realidad, se declara utilizando public name: string azúcar sintáctico public name: string en el constructor.

Como señala Sohnee, se supone que la interfaz oculta todos los detalles de implementación. En mi ejemplo, he elegido la interfaz para requerir un método getter estilo java. Sin embargo, también puede hacer una propiedad y luego dejar que la clase decida cómo implementar la interfaz.


Para complementar las otras respuestas, si su deseo es definir un get value en una interfaz, puede hacer esto:

interface Foo { readonly value: number; } let foo: Foo = { value: 10 }; foo.value = 20; //error class Bar implements Foo { get value() { return 10; } }

pero hasta donde yo sé, y como otros mencionaron, no hay forma de definir actualmente una propiedad de solo ajuste en la interfaz. Sin embargo, puede mover la limitación a un error en tiempo de ejecución (útil solo durante el ciclo de desarrollo):

interface Foo { /* Set Only! */ value: number; } class Bar implements Foo { _value:number; set value(value: number) { this._value = value; } get value() { throw Error("Not Supported Exception"); } }

No es una práctica recomendada ; pero una opción.


Puede especificar la propiedad en la interfaz, pero no puede exigir si se utilizan getters y setters, como este:

interface IExample { Name: string; } class Example implements IExample { private _name: string = "Bob"; public get Name() { return this._name; } public set Name(value) { this._name = value; } } var example = new Example(); alert(example.Name);

En este ejemplo, la interfaz no obliga a la clase a usar getters y setters, podría haber usado una propiedad en su lugar (ejemplo a continuación), pero se supone que la interfaz oculta estos detalles de implementación ya que es una promesa para el código de llamada sobre lo que puede llamar

interface IExample { Name: string; } class Example implements IExample { // this satisfies the interface just the same public Name: string = "Bob"; } var example = new Example(); alert(example.Name);

Y, por último, => no está permitido para los métodos de clase: podría iniciar un debate sobre Codeplex si cree que hay un caso de uso de la quema. Aquí hay un ejemplo:

class Test { // Yes getName = () => ''Steve''; // No getName() => ''Steve''; // No get name() => ''Steve''; }