Je možné použít metody pro čtení / setters v definici rozhraní?

hlasů
50

V tuto chvíli TypeScriptneumožňuje použití get / set metody (přístupové) v rozhraní. Například:

interface I {
      get name():string;
}

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

Dále, strojopisem neumožňuje funkce použití pole výraz v metodách třídy: pro ex .:

class C {
    private _name:string;

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

Existuje nějaký jiný způsob, jak mohu použít získání a nastavení na definice rozhraní?

Položena 11/10/2012 v 12:15
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
68

Můžete určit vlastnosti na rozhraní, ale nelze vynutit, zda jsou používány getry a tvůrci, jako je tento:

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

V tomto příkladu je rozhraní nenutí třídy použité metody pro čtení a zápis, mohl jsem použil vlastnost místo (příklad níže) - ale rozhraní má stejně skrýt tyto podrobnosti implementace, protože je příslibem pro volající kód o tom, co lze nazvat.

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

A konečně, =>není povoleno metod třídy - jste mohli zahájit diskusi o CodePlex pokud si myslíte, že je hořící případ užití pro něj. Zde je příklad:

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

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

    // No
    get name() => 'Steve';
}
Odpovězeno 11/10/2012 v 13:03
zdroj uživatelem

hlasů
16

Doplnit další odpovědi, pokud vaše touha je definovat get valuena rozhraní, můžete to udělat:

interface Foo {
  readonly value: number;
}

let foo: Foo = { value: 10 };

foo.value = 20; //error

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

ale tak daleko, jak jsem si vědom, a jak je uvedeno další, v současné době neexistuje způsob, jak definovat soubor vlastnost jen v rozhraní. Můžete však přesunout omezení na chyby run-time (užitečné v průběhu vývojového cyklu pouze):

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

Nedoporučuje se praxe ; ale možnost.

Odpovězeno 13/12/2016 v 11:32
zdroj uživatelem

hlasů
2

Za prvé, Typescript jen podporuje geta setsyntax, když cílení ECMAScript 5. K dosažení tohoto cíle, musíte volat kompilátor s

tsc --target ES5

Rozhraní nepodporují získání a nastavení. Chcete-li získat kód pro kompilaci budete muset změnit na

interface I { 
    getName():string;
}

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

Co strojopisem dělá podpora je speciální syntaxe pro pole v konstruktérů. Ve vašem případě byste mohli mít

interface I {
    getName():string;
}

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

Všimněte si, jak třída Cneurčuje pole name. Je skutečně deklarované pomocí syntaktický cukr public name: stringv konstruktoru.

Jako Sohnee poukazuje na to, rozhraní má vlastně schovat nějaké detaily implementace. V mém příkladu jsem si vybral rozhraní požadovat metody getter java stylu. Nicméně, můžete také vlastnost a pak ať třída rozhodnout, jak implementovat rozhraní.

Odpovězeno 11/10/2012 v 12:45
zdroj uživatelem

hlasů
0

Používání strojopisem 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());

Viz příklad na psacím stroji hřiště .

Odpovězeno 25/05/2019 v 17:30
zdroj uživatelem

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