2016-11-04 3 views
0

У меня есть класс/viewModel, созданный с помощью TypScript. Я сделал одно поле в этом классе как личное, чтобы пропустить его, когда я пытаюсь получить все остальные свойства класса.Object.keys возвращает частные свойства

Правильно ли и как я могу пропустить свою частную собственность?

Object.keys(myObject).forEach(property => { 
     //some stuff 
    } 
}); 

Пример моего класса:

class MyModel{ 
    id: any = ko.observable(''); 
    name: any = ko.observable(''); 

    address: any = ko.observable(''); 
    city: any = ko.observable(''); 
    state: any = ko.observable(''); 
    country: any = ko.observable(''); 

    private secretField= ko.observable(''); 
} 
+0

Вы пробовали что делает его «защищенным»? Решает ли ваша проблема? –

+0

@SebastianKaczmarek, нет, не помогает – demo

ответ

3

Ключевое слово private влияет только на видимость в TypeScript и не влияет на вывод JS.

Для свойств класса, которые не были определены на прототипе и, следовательно, не могут быть изменены с помощью декораторов класса недвижимости, самый простой способ заключается в использовании _ соглашение об именах для частных свойств:

class MyModel{ 
    ... 
    private _secretField= ko.observable(''); 
} 

... 

Object.keys(myObject) 
.filter(key => !(typeof key === 'string' && key.charAt(0) === '_')) 
.forEach(property => { 
     //some stuff 
    } 
}); 
3

машинопись собирает личные свойства как обычные свойства, исполнение решения только частного начала сделано во время компиляции, и они все еще там во время выполнения.

Есть много запросов на github, чтобы частные свойства были недоступны даже во время выполнения, но из-за ограничений дизайна и/или философских проблем это не было реализовано, и это никогда не будет.

Вы можете прочитать историю обсуждения дизайна here.

Это означает, что вы должны использовать собственное соглашение, чтобы справиться с этим, например, как префикс имени с подчеркиванием и фильтрацией в вашем цикле.