2017-05-26 70 views
1

我得到一个json响应并将其存储在mongodb中,但是我不需要的字段也正在进入数据库,是否有去除uneseccary字段?从打字稿界面对象中删除字段

interface Test{ 
    name:string 
}; 
const temp :Test = JSON.parse('{ "name":"someName","age":20 }') as Test; 
console.log(temp); 

输出:

{ name: 'someName', age: 20 } 
+0

我相信你需要创建一个没有不需要的属性的新对象,并将当前对象转换为该对象。如果从同一接口继承两个接口,则会更好。 – SayusiAndo

回答

2

您可以使用主从给定的对象某些属性的功能:

function pick<T, K extends keyof T>(obj: T, ...keys: K[]): Pick<T, K> { 
    const copy = {} as Pick<T, K>; 

    keys.forEach(key => copy[key] = obj[key]); 

    return copy; 
} 

然后:

let obj = { "name": "someName", "age": 20 }; 
let copy = pick(obj, "name") as Test; 
console.log(copy); // { name: "someName" } 
+0

我已经找到了一个npm包ts-transformer-keys我们可以指定键自动与您的功能 – Bekzod

+0

你看过[源](https://github.com/kimamula/ts-transformer-keys/blob/master/transformer.ts)?它实际上在运行时用ts编译器api打开ts文件以获取对象中的键。这听起来像是一个极端的矫枉过正,我不会使用它 –

1

假设你要删除的年龄

temp = {...temp, age: undefined} 

这将从对象中删除好age

+0

如果有很多我不希望它在那里的领域,该怎么办? – Bekzod

+0

了解,我必须手动选择所需的字段,我有大约30个字段,我需要大约10个 – Bekzod

+0

是的,如果您有几个要删除的键,则速度会很快。选择的答案很好,不要使用'delete'!它很慢! – borislemke

0

接口不会影响运行时行为,因为接口在运行时不存在。你将不得不使用delete删除从对象的属性:

let obj = JSON.parse('{ "name":"someName","age":20 }') 
delete obj.age; 
+1

不要使用'delete',它太痛苦了 – borislemke

+1

@borislemke慢多少? JavaScript比Assembly更慢。它阻止你使用它吗?我不认为这种纳米优化是值得的。 – Saravana

+1

我希望你是对的,但你不是。这是非常非常慢:https://jsperf.com/delete-vs-undefined-vs-null/16 – borislemke