Er det mulig å bruke getters / settere i grensesnittet definisjon?

stemmer
53

For øyeblikket TypeScriptikke tillater bruk get / set metoder (accessors) i grensesnitt. For eksempel:

interface I {
      get name():string;
}

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

Videre betyr Loggfila ikke tillater bruk Array funksjonsuttrykk i klassen metoder: for ex .:

class C {
    private _name:string;

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

Er det noen annen måte jeg kan bruke en getter og setter på et grensesnitt definisjon?

Publisert på 11/10/2012 klokken 11:15
kilden bruker
På andre språk...                            


4 svar

stemmer
75

Du kan angi eiendommen på grensesnittet, men du kan ikke håndheve om kundeskaffere og settere brukes, som dette:

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

I dette eksempelet betyr grensesnittet ikke tvinge klassen til å bruke kundeskaffere og settere, jeg kunne ha brukt en eiendom i stedet (eksempel nedenfor) - men grensesnittet er ment å skjule disse implementasjonsdetaljene likevel som det er et løfte til ringer koden om hva det kan ringe.

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

Og til slutt, =>er ikke tillatt for klassen metoder - du kan starte en diskusjon om CodePlex hvis du tror det er et brennende bruken sak for det. Her er et eksempel:

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

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

    // No
    get name() => 'Steve';
}
Svarte 11/10/2012 kl. 12:03
kilden bruker

stemmer
19

For å supplere de andre svarene, hvis ønske er å definere en get valueav et grensesnitt, kan du gjøre dette:

interface Foo {
  readonly value: number;
}

let foo: Foo = { value: 10 };

foo.value = 20; //error

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

men så vidt jeg vet, og som andre har nevnt, er det ingen måte i dag for å definere et sett-bare eiendom i grensesnittet. Du kan imidlertid flytte begrensning for en kjøretidsfeil (nyttig i utviklingen syklus only):

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

Ikke anbefalt praksis ; men et alternativ.

Svarte 13/12/2016 kl. 11:32
kilden bruker

stemmer
2

Først av alt, Loggfila bare støtter getog setsyntaks når target ECMAScript 5. For å oppnå dette, må du ringe kompilatoren med

tsc --target ES5

Grensesnitt støtter ikke kundeskaffere og settere. For å få koden til å kompilere du ville ha til å endre det til

interface I { 
    getName():string;
}

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

Hva Loggfila gjør støtte er en spesiell syntaks for felt i konstruktører. I ditt tilfelle, kan du ha

interface I {
    getName():string;
}

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

Legg merke til hvordan klassen Cikke angir feltet name. Det er faktisk erklært bruke syntetisk sukker public name: stringi konstruktøren.

Som Sohnee påpeker, er grensesnittet faktisk skal skjule eventuelle gjennomføring detaljer. I mitt eksempel, har jeg valgt grensesnittet til å kreve en java-stil getter metoden. Du kan imidlertid også en eiendom og deretter la klassen bestemme hvordan man implementerer grensesnittet.

Svarte 11/10/2012 kl. 11:45
kilden bruker

stemmer
0

Bruke Loggfila 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());

Se eksempel på typescript Lekeplass .

Svarte 25/05/2019 kl. 17:30
kilden bruker

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