如何使用TypeScript将大对象映射到较小的接口?

时间:2018-05-23 16:05:48

标签: typescript object interface

我有一个从包含例如

的服务器返回的对象
{
    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。

如何将完整对象映射到这个较小的界面(希望无需编写显式的map函数)或以其他方式强制TypeScript忽略这些字段?

2 个答案:

答案 0 :(得分:3)

Typescript类型没有运行时影响,因此将对象转换为不同类型将在运行时对该对象没有实际影响。

其中一个goals的TypesScript:

  
      
  1. 使用一致的完全可擦除结构类型系统。
  2.   

我强调的重点

如果要修改对象,则需要超出类型的代码才能执行修改。鉴于无法像您正在寻找的那样在值和类型之间进行转换(请参阅this issue进一步讨论),您需要执行以下操作:

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;

答案 1 :(得分:0)

我必须将较大的对象从API分解为较小的类。首先,我使用与API中的对象相同的属性名称创建了较小的类。

function geocode(text,platform) {

var geocoder = platform.getGeocodingService(),
geocodingParameters = {
  searchText: 'Sidi allal tazi 14052 kenitra',
  jsonattributes : 1
};

在创建对象的实例时,我使用构造函数使它的对象具有默认值。

geocoder.geocode(geocodingParameters,onSuccess,onError);

然后从API接收对象后,可以使用以下两种方法之一来实例化export class SmallerClass { prop1: type, prop2: type, ... constructor(){ // set default values to the props } } 的实例:
1.使用let myObj = new SmallerClass(); let apiObj = `API Call`; 语法

SmallerClass

2。使用key in Object

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