从对象中删除未在类型接口中声明的属性

Pat*_*ind 9 typescript

我想从未在特定类型接口中声明的对象中删除所有属性。

例如,假设我有以下界面:

export interface CreateCustomerUserInput {
    fullname: string;
    email: string;
}
Run Code Online (Sandbox Code Playgroud)

我有以下对象:

let obj = {fullname: 'AAA', email: 'aa@aa.com', phone: '111', address: 'XXX'};
Run Code Online (Sandbox Code Playgroud)

但我想创建一个仅在类型接口中声明属性的新对象。这是预期的对象:

let c = {fullname: 'AAA', email: 'aa@aa.com'}
Run Code Online (Sandbox Code Playgroud)

在 TypeScript 中有什么好的方法可以解决这个问题吗?

ggr*_*nig 9

如果我理解正确的话,您想从对象中删除未在特定类型接口中定义的所有属性。

不幸的是,类型接口在运行时不可用 - 这意味着它们在运行 JavaScript 代码时不存在。因此,无法以编程方式访问有关类型的反射信息。

但是,您可能会通过使用class. 例如,假设您有以下课程:

export class CreateCustomerUserInput {
    public fullname: string = "";
    public email: string = "";
}
Run Code Online (Sandbox Code Playgroud)

您可以创建该类的实例,并使用for.. in循环或 with迭代其属性Object.keys()delete然后,您可以通过使用类实例中不可用的每个属性来去除给定对象的属性。

为此,请确保类的所有属性在构造后都已初始化。

另一种方法是使用带有实验性元数据标志的 TypeScript 装饰器,如下所述: http: //www.typescriptlang.org/docs/handbook/decorators.html

它们保留反射信息,但仅限于类(或抽象类)!