машинопись использовать класс / интерфейс для удаления свойств из объекта - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть следующий объект:

{
   name: 'Jon',
   gender: 'male',
   secret: 'xxx'
}

и интерфейс:

interface PublicUserData {
    name: string
    gender: string
}

Можно ли как-то перебрать все свойства PublicUserData и удалить все свойства из другого объекта, которого нет в интерфейсе?

Я знаю, что для получения этой информации мне придется использовать отражающие метаданные, но сейчас мне понадобится некоторый намек, чтобы указать мне правильное направление

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Этого можно достичь с помощью декораторов и метаданных отражений (как вы уже отметили), но важно понимать, что интерфейсы TS не являются функцией языка JS и, следовательно, не дают возможности для отражения. Они полностью стираются во время выполнения. Вместо этого вам придется реализовать его с использованием реальных классов.

Возможно, вам будет проще просто сохранить массив строк, соответствующих интересующим вас свойствам объекта, и использовать семейство методов Object.keys для удаления ненужных вещей.

0 голосов
/ 05 сентября 2018

Через интерфейс это не будет работать, но вы можете сделать это:

interface IUserData{
    name: string;
    gender: string;
    secret: string;
}

class PublicUserData {
    name: string;
    gender: string;
    constructor(data: IUserData){
        this.name = data.name;
        this.gender = data.gender;
    }
}

class UserData extends PublicUserData implements IUserData {
    secret: string;
    constructor(data: IUserData){
        super(data);
        this.secret = data.secret;
    }
}

И так используйте:

var data = {
    name: 'Jon',
    gender: 'male',
    secret: 'xxx'
 } as IUserData;

 var publicUserData = new PublicUserData(data);
 var userData = new UserData(data);
 var publicUserData2 = new PublicUserData(userData);

Результат:

 publicUserData: {name: "Jon", gender: "male"}
 publicUserData2:{name: "Jon", gender: "male"}
 userData: {name: "Jon", gender: "male", secret: "xxx"}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...