Este posibil să se utilizeze în setter / get definiție interfață?

voturi
50

În acest moment, TypeScriptnu permite utilizarea get / set metode ( Conturi cu acces) în interfețe. De exemplu:

interface I {
      get name():string;
}

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

în plus, typescript nu permite utilizarea expresiei Array Funcția în metode de clasă: de ex .:

class C {
    private _name:string;

    get name():string => this._name;
}

Există vreun alt mod în care pot folosi un getter și setter pe o definiție interfață?

Întrebat 11/10/2012 la 12:15
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
68

Puteți specifica proprietatea pe interfata, dar nu se poate pune în aplicare dacă sunt folosite getters și setteri, ca aceasta:

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);

În acest exemplu, interfața nu forțează clasa de a utiliza getters și setteri, am putea fi folosit în loc o proprietate (exemplul de mai jos) - dar interfața ar trebui să ascundă aceste detalii de implementare, oricum, deoarece este o promisiune la codul de asteptare despre ceea ce se poate apela.

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);

Și , în sfârșit, =>nu este permisă pentru metodele clasei - ai putea începe o discuție pe CodePlex dacă credeți că există un caz de utilizare ardere pentru ea. Iată un exemplu:

class Test {
    // Yes
    getName = () => 'Steve';

    // No
    getName() => 'Steve';

    // No
    get name() => 'Steve';
}
Publicat 11/10/2012 la 13:03
sursa de către utilizator

voturi
16

Pentru a completa celelalte răspunsuri, în cazul în care dorința este de a defini o get valuepe o interfață, puteți face acest lucru:

interface Foo {
  readonly value: number;
}

let foo: Foo = { value: 10 };

foo.value = 20; //error

class Bar implements Foo {
  get value() {
    return 10;
  }
}

dar, în măsura în care eu sunt conștient, și cum alții au menționat, nu există nici o modalitate în prezent pentru a defini o proprietate numai set în interfață. Puteți, totuși, mutați limitarea unei erori run-time (util in timpul ciclului de dezvoltare numai):

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");
  }
}

Nu se recomandă practică ; ci o opțiune.

Publicat 13/12/2016 la 11:32
sursa de către utilizator

voturi
2

În primul rând, typescript acceptă numai getși setsintaxă atunci când țintirea EcmaScript 5. Pentru a realiza acest lucru, trebuie să apel compilator cu

tsc --target ES5

Interfețe nu acceptă getters și setteri. Pentru a obține codul pentru a compila va trebui să-l schimbe pentru a

interface I { 
    getName():string;
}

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

Ce dactilografiat are suport este o sintaxă specială pentru câmpurile din constructori. In cazul tau, ai putea avea

interface I {
    getName():string;
}

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

Observați modul în care clasa Cnu specifică domeniu name. Acesta este , de fapt declarată folosind zahăr sintactic public name: stringîn constructor.

După cum subliniază Sohnee, interfața este, de fapt ar trebui să ascundă orice detalii de implementare. În exemplul meu, am ales interfața pentru a solicita o metodă getter-stil java. Cu toate acestea, puteți, de asemenea, o proprietate și apoi lăsați clasei să decidă cum să pună în aplicare interfața.

Publicat 11/10/2012 la 12:45
sursa de către utilizator

voturi
0

Utilizarea typescript 3.4:

interface IPart {
    getQuantity(): number;
}

class Part implements IPart {
    private quantity: number;
    constructor(quantity: number) {
        this.quantity = quantity;
    }
    public getQuantity = (): number => {
        return this.quantity;
    };
}

let part = new Part(42);

// When used in typescript, quantity is not accessible.
// However, when compiled to javascript it will log '42'.
console.log(part.quantity);

// Logs '42'.
console.log(part.getQuantity());

A se vedea , de exemplu , pe masina de scris Playground .

Publicat 25/05/2019 la 17:30
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more