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

У меня есть объект, возвращенный с сервера, который содержит, например,

{
    lorem: 1,
    ipsa: [2,3],
    dolor: { sit: 'amet', consectetur: 'adipiscing'},
    elit: [{you: 'get'}, {the: 'picture'}]
}

и интерфейс TypeScript

export interface smallerInterface {
    ipsa: number[];
    elit: any[];
}

Я сохраняю возвращенный объект в IndexedDb, и неЯ не хочу сохранять поля, отсутствующие в интерфейсе.

Я пробовал приводить fullObject as smallerInterface и <smallerInterface>fullObject, но при сохранении этого объекта в IndexedDb он все еще включает в себя поля lorem и dolor.

Как можно сопоставить полный объект с этим меньшим интерфейсом (надеюсь, без написания явной функции карты) или иным образом заставить TypeScript игнорировать эти поля?

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Мне нужно разбить больший объект от API до меньших классов.Прежде всего я создал меньший класс, используя то же имя свойства, что и объект из API.

export class SmallerClass {
    prop1: type,
    prop2: type,
    ...
   constructor(){
       // set default values to the props
   }
}

Я использую конструктор, чтобы при создании экземпляра объекта был объект со значениями по умолчанию.

let myObj = new SmallerClass();

let apiObj = `API Call`;

Затем, после получения объекта из API, экземпляр SmallerClass может быть создан с использованием любого из следующих методов:1. Используя key in Object синтаксис

Object.keys(this.myObj).map((key) => {
   if (key in this.apiObj) {
      this.myObj [key] = this.apiObj[key];
   }
});

2.Использование hasOwnProperty

Object.keys(this.myObj).map((key) => {
   if (this.apiObj.hasOwnProperty(key)) {
      this.myObj[key] = this.apiObj[key];
   }
});
0 голосов
/ 23 мая 2018

Типы Typescript не оказывают влияния на время выполнения, поэтому приведение объекта к различным типам не окажет ощутимого влияния на этот объект во время выполнения.

Одна из целей TypesScript:

Используйте последовательную, полностью стираемую систему структурных типов.

выделение, добавленное мной

Если выхотите изменить объект, вам нужен код за пределами типов для выполнения модификации.Учитывая невозможность преобразования между значениями и типами, которые вы ищете (см. эту проблему для дальнейшего обсуждения), вам нужно будет сделать что-то вроде:

export interface SmallerInterface {
    ipsa: number[];
    elit: any[];
}

export const smallerKeys = ['ipsa', 'elit'];

// Later once you have a result
const result = await makeRequest();
const reducedResult = smallerKeys.reduce((obj, key) =>
    ({ 
        ...obj, 
        [key]: result[key],
    }),
    {}
) as SmallerInterface;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...