2017-01-18 4 views
2

Я был удивлен, узнав, что свойства класса TypeScript могут исчезнуть из переданного вывода, если им никогда не назначено значение.Обязательные свойства не определены

Этот машинопись класс ...

class Foo { 
    value: any; 
} 

становится ..

var Foo = (function() { 
    function Foo() { 
    } 
    return Foo; 
}()); 

Свойство Foo.value не объявлен в качестве дополнительного имущества, так что я бы ожидать, что конструктор для создания этого имущества, независимо от того, было ли ему присвоено значение.

var Foo = (function() { 
    function Foo() { 
     Object.defineProperty(this, 'value', {}); 
    } 
    return Foo; 
}()); 

Как я могу получить это поведение?

+0

Может быть просто вид оптимизации? Нет смысла создавать какой-либо код для свойств, которые никогда не назначаются, следовательно, всегда не определены. – enkryptor

+2

Итак, нет ли проверяемой разницы между свойством, значение которого установлено на 'undefined' и полное отсутствие свойства? –

+0

Я верю, что 'hasOwnProperty' будет вести себя по-другому @StevenLiekens – Paarth

ответ

2

Простейший способ гарантировать, что это свойство передается, - это присвоить ему значение ... явный null должен работать для вас.

class Foo { 
    value: any = null; 
} 

свойства Конструкторы также всегда выход:

class Foo { 
    constructor(public value: any) { } 
} 

Или, если вы отчаянно хотите это сделать с Object.defineProperty ...

class Foo { 
    private _foo: string; 

    get foo() { return this._foo; } 
    set foo(value: string) { this._foo = value;} 
} 
+1

Это будет означать 'this.value = value', а не' Object.defineProperty (...) '. – artem

+0

Добавлен дополнительный пример. – Fenton

Смежные вопросы