Πώς να προσαρμόσετε τις ιδιότητες στη γραφομηχανή

ψήφοι
10

Πώς μπορώ να πάρω γραφομηχανή να εκπέμπει ορισμούς ακινήτων, όπως:

Object.defineProperties(this, {
    view: {
        value: view,
        enumerable: false,
        writable: false,
        configurable: false
    },
});
Δημοσιεύθηκε 02/10/2012 στις 19:40
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
9

Μπορείτε να χρησιμοποιήσετε getκαι setστη γραφομηχανή, η οποία συγκεντρώνει σε Object.defineProperties.

Αυτό είναι ένα χαρακτηριστικό ECMAScript 5, έτσι δεν μπορείτε να το χρησιμοποιήσετε αν είστε στόχευση ES3 (η προεπιλεγμένη για τον compiler). Εάν είστε ευτυχείς να στοχεύσετε ES5, προσθέστε --target ES5στην εντολή σας.

γραφομηχανή:

class MyClass {
    private view;
    get View() { return this.view; }
    set View(value) { this.view = value }
}

Συγκεντρώνει σε:

var MyClass = (function () {
    function MyClass() { }
    Object.defineProperty(MyClass.prototype, "View", {
        get: function () {
            return this.view;
        },
        set: function (value) {
            this.view = value;
        },
        enumerable: true,
        configurable: true
    });
    return MyClass;
})();

Αλλά αν θέλετε πλήρη έλεγχο της δημιουργίας enumerable και ρύθμισης - θα μπορούσε ακόμα να χρησιμοποιήσει την πρώτη Object.definePropertiesκώδικα.

Απαντήθηκε 04/10/2012 στις 22:42
πηγή χρήστη

ψήφοι
4

Έψαχνα για ακριβώς το ίδιο πράγμα, όταν σκόνταψα σε γραφομηχανή Εγχειρίδιο: Διακοσμητές . Στο «Μέθοδος Διακοσμητές» παράγραφο καθορίζουν @enumerableεργοστάσιο διακοσμητής, το οποίο μοιάζει με αυτό (είμαι απλώς αντιγραφή-επικόλληση από εκεί):

function enumerable(value: boolean) {
    return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
        descriptor.enumerable = value;
    };
}

και να το χρησιμοποιήσετε ως εξής:

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }

    @enumerable(false)
    greet() {
        return "Hello, " + this.greeting;
    }
}

Έτσι, ένας άλλος τρόπος αντιμετώπισης του, είναι μέσω της χρήσης των διακοσμητών.

PS: Αυτή η λειτουργία απαιτεί experimentalDecoratorsσημαία που πρέπει να περάσει για να tscή που καθορίζονται tsconfig.json.

Απαντήθηκε 27/02/2017 στις 16:39
πηγή χρήστη

ψήφοι
1

Αυτό δεν υποστηρίζεται προς το παρόν, αν θέλετε όλες οι ιδιότητες που πρέπει να εκπέμπεται σαν αυτό. Θα ήθελα να συστήσω κατάθεση θέμα στο χώρο CodePlex με λεπτομέρειες για το τι είναι η περίπτωση χρήσης και τις απαιτήσεις σας.

Αν το κάνετε compile με --target ES5, μπορείτε να έχετε κάτι σαν αυτό:

class n {
    get foo() { return 3; }
    bar() { return 5; }
}

Η οποία παράγει αυτόν τον κωδικό:

var n = (function () {
    function n() { }
    Object.defineProperty(n.prototype, "foo", {
        get: function () {
            return 3;
        },
        enumerable: true,
        configurable: true
    });
    n.prototype.bar = function () {
        return 5;
    };
    return n;
})();
Απαντήθηκε 02/10/2012 στις 19:43
πηγή χρήστη

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