从 TypeScript 接口对象中删除字段

8
我在获取JSON响应并将其存储在MongoDB中,但是我不需要的字段也进入了数据库,是否有办法去除不必要的字段?
interface Test{
    name:string
};
const temp :Test = JSON.parse('{ "name":"someName","age":20 }') as Test;
console.log(temp);

输出:

{ name: 'someName', age: 20 }

我相信您需要创建一个新对象,该对象不具有不需要的属性,并将当前对象转换为该对象。如果您从同一个接口继承两个接口,则最好。 - AndrasCsanyi
4个回答

13

你可以使用一个函数来从给定的对象中选取特定的属性:

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" }

我发现了一个npm包ts-transformer-keys,我们可以使用你的函数自动指定键。 - Bekzod
2
你看过源代码了吗?它实际上在运行时使用ts编译器API打开ts文件以获取对象中的键。听起来有点过度,我不会使用它。 - Nitzan Tomer

4
假设你有这个对象。
const x = {a: 1, b: 2, c: 3};

如果你想创建一个只包含 ab 的对象,可以使用以下方法。
const {c, ...y} = x;
console.log(y);

你会发现y现在只有ab。此外,如果字段c不在x中,这也不会出错。例如:
const x: any = {a: 1, b: 2, c: 3};
const {d, ...y} = x;
console.log(y);

这段代码可以完美运行,不会出现任何错误。如果你记录d的值,它将是未定义的。


2
假设您想删除年龄。
temp = {...temp, age: undefined}

这将永久地从您的对象中移除age

如果有很多字段我不想要,怎么办? - Bekzod
明白了,我必须手动选择我想要的字段,我大约有30个字段,我需要大约10个。 - Bekzod
是的,如果你要删除的键很少,这是快速的。所选答案很好,不要使用delete!它很慢! - borislemke

0
如果您想以强类型的方式实现此操作,可以定义一个虚拟/理想对象来满足您的接口(const dummy: IMyInterface = {someField: "someVal"};),然后对传入对象的字段进行过滤,以匹配 Object.keys(dummy)。这样,如果您更新接口但不更新此“过滤”代码,编译器就会发出警告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接