我有一个从包含例如
的服务器返回的对象{
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忽略这些字段?
答案 0 :(得分:3)
Typescript类型没有运行时影响,因此将对象转换为不同类型将在运行时对该对象没有实际影响。
其中一个goals的TypesScript:
- 使用一致的完全可擦除结构类型系统。
醇>
我强调的重点
如果要修改对象,则需要超出类型的代码才能执行修改。鉴于无法像您正在寻找的那样在值和类型之间进行转换(请参阅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];
}
});