Как настроить свойства в машинописном

голоса
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 (по умолчанию для компилятора). Если вы счастливы целевой 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;
})();

Но если вы хотите иметь полный контроль над установкой перечислима и настраивается - можно по- прежнему использовать необработанный Object.definePropertiesкод.

Ответил 04/10/2012 в 22:42
источник пользователем

голоса
4

Я искал точно то же самое , когда я наткнулся на машинописи Handbook: декоратор . В «Метод Декораторы» пункта они определяют @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 с подробной информацией о том , что ваш случай использования и требования.

Если вы компилируете с --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