Ist es möglich, Getter / Setter in Schnittstellendefinition zu benutzen?

stimmen
50

Im Moment TypeScripterlaubt die Verwendung nicht get / set - Methoden (Accessoren) in Schnittstellen. Beispielsweise:

interface I {
      get name():string;
}

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

für ex .:: Weiterhin ist Typoskript nicht Gebrauch Array Funktion Expression in Klassenmethoden erlauben

class C {
    private _name:string;

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

Gibt es irgendeine andere Weise, die ich einen Getter und Setter auf einer Interface-Definition verwenden kann?

Veröffentlicht am 11/10/2012 um 12:15
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
68

Sie können die Eigenschaft auf der Schnittstelle angeben, aber Sie können nicht erzwingen, ob Getter und Setter verwendet werden, wie folgt aus:

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

In diesem Beispiel ist die Schnittstelle nicht die Klasse zwingen Getter und Setter zu verwenden, habe ich eine Eigenschaft statt (Beispiel unten) verwendet haben könnte - aber das Interface soll diese Implementierungsdetails ohnehin verstecken, wie es ein Versprechen an den aufrufenden Code ist über das, was es so nennen kann.

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

Und schließlich =>ist nicht für Klassenmethoden erlaubt - man könnte eine Diskussion über die Codeplex beginnen , wenn Sie denken , es ist ein brennender Anwendungsfall für sie. Hier ist ein Beispiel:

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

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

    // No
    get name() => 'Steve';
}
Beantwortet am 11/10/2012 um 13:03
quelle vom benutzer

stimmen
16

Um die anderen Antworten zu ergänzen, wenn Ihr Wunsch ist zu definieren , get valueauf einer Schnittstelle, können Sie dies tun:

interface Foo {
  readonly value: number;
}

let foo: Foo = { value: 10 };

foo.value = 20; //error

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

aber soweit ich weiß, und wie andere schon erwähnt, gibt es keine Möglichkeit zur Zeit eine Reihe geschützter Eigenschaft in der Schnittstelle zu definieren. Sie können jedoch die Beschränkung auf einen Laufzeitfehler bewegen (nützlich während des Entwicklungszyklus nur):

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

Nicht Praxis empfohlen ; aber eine Option.

Beantwortet am 13/12/2016 um 11:32
quelle vom benutzer

stimmen
2

Zunächst einmal unterstützt Typoskript nur getund setSyntax , wenn ECMAScript 5. Targeting Um dies zu erreichen, müssen Sie den Compiler aufrufen mit

tsc --target ES5

Schnittstellen unterstützen keine Getter und Setter. Um den Code zu kompilieren, würden Sie es ändern müssen, um

interface I { 
    getName():string;
}

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

Was Typoskript tut Unterstützung eine spezielle Syntax für Felder in Konstrukteuren ist. In Ihrem Fall könnten Sie haben

interface I {
    getName():string;
}

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

Beachten Sie, wie Klasse Cdas Feld nicht spezifiziert name. Es wird tatsächlich mit syntaktischem Zucker erklärt public name: stringim Konstruktor.

Wie Sohnee weist darauf hin, wird die Schnittstelle tatsächlich alle Implementierungsdetails verbergen soll. In meinem Beispiel habe ich die Schnittstelle ausgewählt, um eine Java-Stil Getter-Methode erforderlich ist. Sie können aber auch eine Eigenschaft und dann lassen Sie die Klasse entscheiden, wie die Schnittstelle zu implementieren.

Beantwortet am 11/10/2012 um 12:45
quelle vom benutzer

stimmen
0

Mit Typoskript 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());

Siehe Beispiel auf Typoskript Spielplatz .

Beantwortet am 25/05/2019 um 17:30
quelle vom benutzer

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