2016-04-18 2 views
1

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

class Example { 
    private _field; 

    constructor(field) { 
    this._field = field; 
    } 

    get field() { 
    return this._field; 
    } 
} 

Проблема заключается в том, что, когда я JSON.stringify(new Example('whatever'))_field также сериализованный. Мой текущий обходной путь, чтобы определить свойство внутри конструктора с закрытием

class Example { 

    constructor(field) { 
    Object.defineProperty(this, 'field', { 
     get:() => field; 
    } 
    } 
} 

Таким образом, мне не нужно поле, но теперь компилятор TS жалуется, что нет field собственности. Есть ли способ лучше?

Или, может быть, я должен найти способ исключить из сериализации _field?

+1

Вы можете использовать функцию? "getField() {return this._field;}" – TSV

ответ

0

Что написал @SlavaShp это (на мой взгляд) путь, но вы можете положить, что в один класс, который затем можно расширить, чтобы получить такое поведение для каждого нового класса вам нужно.

Что-то вроде:

abstract class JsonEncoded { 
    private exposedFields: string[]; 

    constructor(fields: string[]) { 
     this.exposedFields = fields; 
    } 

    public toJSON(): string { 
     let json = ""; 
     this.exposedFields.forEach(fieldName => json += fieldName + ":" + JSON.strinify(this[fieldName])); 

     return "{" + json + "}"; 
    } 
} 

Тогда вы просто расширить и сообщить CTOR, какие поля он должен включать в себя:

class Example extends JsonEncoded { 
    private _field; 

    constructor(field) { 
     super(["field"]); 
     this._field = field; 
    } 

    get field() { 
     return this._field; 
    } 
} 
0

Вы можете подойти к проблеме с сериализации части:

let result = JSON.stringify(obj, (key, value) => 
    { 
     if(key.lastIndexOf("_", 0) === 0) 
     { 
      //Skip private fields assuming they all start with _ 
      return undefined; 
     } 
     else 
     { 
      return value; 
     } 
    }); 

Это может быть не такой плохой идеей, принимая во внимание, что если вы собираетесь сериализовать сложные объекты, которые вы, скорее всего, придется выполнить некоторые (например) пропустить некоторые поля на основе критериев бизнес-логики.

0

Вы можете создать метод toJson на своем объекте, чтобы предоставить свойства для сериализации. Stringify будет использовать его. Вы можете посмотреть здесь stringify documentation

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