erhalten und setzen in Typoskript

stimmen
320

Ich versuche, get und set-Methode für eine Eigenschaft zu erstellen:

private _name: string;

Name() {
    get:
    {
        return this._name;
    }
    set:
    {
        this._name = ???;
    }
}

Was ist das Schlüsselwort Wert zu setzen?

Veröffentlicht am 10/10/2012 um 20:52
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
571

Maschinenschrift verwendet Get- / Set-Syntax, wie ActionScript3 ist.

class foo {
    private _bar:boolean = false;
    get bar():boolean {
        return this._bar;
    }
    set bar(theBar:boolean) {
        this._bar = theBar;
    }
}

Das wird dieses Javascript erzeugen, die ECMAScript 5 Object.defineProperty () Funktion.

var foo = (function () {
    function foo() {
        this._bar = false;
    }
    Object.defineProperty(foo.prototype, "bar", {
        get: function () {
            return this._bar;
        },
        set: function (theBar) {
            this._bar = theBar;
        },
        enumerable: true,
        configurable: true
    });
    return foo;
})();

Also, es zu benutzen,

var myFoo = new foo();
if(myFoo.bar) {         // calls the getter
    myFoo.bar = false;  // calls the setter and passes false
}

Um jedoch, es zu benutzen überhaupt, müssen Sie das Typoskript Compiler Ziele ECMAScript5 sicherstellen. Wenn Sie die Befehlszeile-Compiler ausführen, verwenden --target Flagge wie diese;

tsc --target ES5

Wenn Sie Visual Studio verwenden, müssen Sie Ihre Projektdatei bearbeiten , um die Fahne auf die Konfiguration für das TypeScriptCompile Build - Tool hinzuzufügen. Sie können sehen , dass hier :

Wie @DanFromGermany unten schon sagt, wenn Ihr einfach lesen und eine lokale Eigenschaft wie foo.bar = true zu schreiben, dann ein Setter und Getter Paar ist übertrieben. Sie können sie später immer noch hinzufügen, wenn Sie etwas tun müssen, wie die Protokollierung, wann immer die Eigenschaft gelesen oder geschrieben werden.

Beantwortet am 12/10/2012 um 01:19
quelle vom benutzer

stimmen
47

Ezward hat bereits eine gute Antwort, aber ich bemerkte, dass einer der Kommentare fragt, wie es verwendet wird. Für Leute wie mich, die über diese Frage stolpern, dachte ich, es wäre nützlich, einen Link zu der offiziellen Dokumentation auf Getter und Setter auf der Typoskript Website zu haben als dass es gut erklärt, wird hoffentlich immer bleiben up-to-date wie Änderungen gemacht, und zeigt Beispiel Nutzung:

http://www.typescriptlang.org/docs/handbook/classes.html

Insbesondere für diejenigen, nicht mit ihm vertraut, beachten Sie, dass Sie ‚get‘ in einen Aufruf an ein Getter (und ähnlich für Setter) nicht das Wort übernehmen:

var myBar = myFoo.getBar(); // wrong    
var myBar = myFoo.get('bar');  // wrong

Sie sollten dies einfach tun:

var myBar = myFoo.bar;  // correct (get)
myFoo.bar = true;  // correct (set) (false is correct too obviously!)

gegeben eine Klasse wie:

class foo {
  private _bar:boolean = false;

  get bar():boolean {
    return this._bar;
  }
  set bar(theBar:boolean) {
    this._bar = theBar;
  }
}

dann werden die ‚Bar‘ Getter für das private '_bar Eigentum genannt werden.

Beantwortet am 15/01/2016 um 12:53
quelle vom benutzer

stimmen
41

Hier ist ein funktionierendes Beispiel, dass Sie in der richtigen Richtung zeigen soll:

class Foo {
    _name;

    get Name() {
        return this._name;
    }

    set Name(val) {
        this._name = val;
    }
}

Getter und Setter in JavaScript sind nur ganz normale Funktionen. Der Setter ist eine Funktion, die einen Parameter, dessen Wert annimmt, ist der Wert eingestellt wird.

Beantwortet am 10/10/2012 um 21:07
quelle vom benutzer

stimmen
2

Es ist sehr ähnlich zu herkömmlichen Methoden erstellen, einfach das reservierten Schlüsselwort setzen getoder setam Anfang.

class Name{
    private _name: string;

    getMethod(): string{
        return this._name;
    }

    setMethod(value: string){
        this._name = value
    }

    get getMethod1(): string{
        return this._name;
    }

    set setMethod1(value: string){
        this._name = value
    }
}

class HelloWorld {

    public static main(){

        let test = new Name();

        test.setMethod('test.getMethod() --- need ()');
            console.log(test.getMethod());

        test.setMethod1 = 'test.getMethod1 --- no need (), and used = for set ';
            console.log(test.getMethod1);
    }
}
HelloWorld.main();

In diesem Fall können Sie den Rückgabetyp überspringen in get getMethod1() {

    get getMethod1() {
        return this._name;
    }
Beantwortet am 22/03/2016 um 14:13
quelle vom benutzer

stimmen
2

Sie können dies schreiben

class Human {
    private firstName : string;
    private lastName : string;

    constructor (
        public FirstName?:string, 
        public LastName?:string) {

    }

    get FirstName() : string {
        console.log("Get FirstName : ", this.firstName);
        return this.firstName;
    }
    set FirstName(value : string) {
        console.log("Set FirstName : ", value);
        this.firstName = value;
    } 

    get LastName() : string {
        console.log("Get LastName : ", this.lastName);
        return this.lastName;
    }
    set LastName(value : string) {
        console.log("Set LastName : ", value);
        this.lastName = value;
    } 

}
Beantwortet am 11/10/2012 um 19:32
quelle vom benutzer

stimmen
0

TS bietet Getter und Setter , die Objekteigenschaften ermöglichen eine bessere Kontrolle zu haben , wie auf sie zugegriffen wird (Getter) oder aktualisiert (Setter) außerhalb des Objekts. Anstatt direkt zugreifen oder die Eigenschaft eine Proxy - Funktion aufgerufen wird , zu aktualisieren.

Beispiel:

class Person {
    constructor(name: string) {
        this._name = name;
    }

    private _name: string;

    get name() {
        return this._name;
    }

    // first checks the length of the name and then updates the name.
    set name(name: string) {
        if (name.length > 10) {
            throw new Error("Name has a max length of 10");
        }

        this._name = name;  
    }

    doStuff () {
        this._name = 'foofooooooofoooo';
    }


}

const person = new Person('Willem');

// doesn't throw error, setter function not called within the object method when this._name is changed
person.doStuff();  

// throws error because setter is called and name is longer than 10 characters
person.name = 'barbarbarbarbarbar';  
Beantwortet am 11/07/2019 um 17:53
quelle vom benutzer

stimmen
0

Ich glaube , ich wahrscheinlich bekommen , warum ist es so verwirrend. In Ihrem Beispiel wollten wir Getter und Setter für _name. Aber wir das erreichen von Getter und Setter für einen unabhängigen Klassenvariable zu schaffen Name.

Bedenken Sie:

class Car{
    private tiresCount = 4;
    get yourCarTiresCount(){
        return this.tiresCount ;
    }
    set yourCarTiresCount(count) {
        alert('You shouldn't change car tire count')
    }
}

Obiger Code funktioniert folgendermaßen vor:

  1. getund seterstellen Getter und Setter für yourCarTiresCount( nichttiresCount ).

Der Getter ist:

function() {
    return this.tiresCount ;
}

und die Setter ist:

function(count) {
    alert('You shouldn't change car tire count');
}

Das heißt, jedes Mal , wenn wir tun new Car().yourCarTiresCount, Getter läuft. Und für jeden new Car().yourCarTiresCount('7')Setter läuft.

  1. Indirekt erstellen Getter, aber nicht die Setter, für private tireCount.
Beantwortet am 13/10/2017 um 19:11
quelle vom benutzer

stimmen
-2

Wenn Sie mit Typoskript Module arbeiten und versuchen, einen Getter hinzuzufügen, die exportiert wird, können Sie etwas tun, wie folgt:

// dataStore.ts
export const myData: string = undefined;  // just for typing support
let _myData: string;  // for memoizing the getter results

Object.defineProperty(this, "myData", {
    get: (): string => {
        if (_myData === undefined) {
            _myData = "my data";  // pretend this took a long time
        }

        return _myData;
    },
});

Dann in einer anderen Datei, die Sie haben:

import * as dataStore from "./dataStore"
console.log(dataStore.myData); // "my data"
Beantwortet am 28/12/2017 um 18:34
quelle vom benutzer

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