2017-05-26 74 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