我有一些对象实现了一些接口,但它们也有额外的属性。当我开始序列化它们(保存在文件中)时,我希望删除所有这些额外的属性,只保留与接口匹配的属性。
有没有一种方法可以“清理”一个给定接口的对象?我试过
Object.getOwnPropertyNames(myObject)
获取对象属性的完整列表,并与接口属性的完整列表进行比较,但我无法找到获取接口属性列表的方法
编辑:我在这里找到了一种方法:How can I create an object based on an interface file definition in TypeScript?
与
var object = <IMyInterface>{};
但是我看到当我使用Object.getOwnPropertyNames(myObject)时,这只对定义的属性有效,如果一个属性没有定义,它就不在结果中。有没有一种方法可以获取所有可用的属性,而不仅仅是定义的属性?
4条答案
按热度按时间mctunoxg1#
验证代码:
它编译成:
(code在Playground)
因此,您可以看到,在编译后的(js)代码中,接口并不存在,因此您无法知道(在运行时)需要保留哪些属性。
你可以做的是:
(code在Playground)
g0czyy6m2#
我真的很喜欢@Nitzan的回答,但是我遇到的一个问题是,当我更新类型时,硬编码到字符串数组中的键并不更新,这导致了错误,否则这些错误会被typescript捕获。因此,我建议也键入键字符串数组,以便typescript在您以后更改类型时也提示您更新它:
qmb5sa223#
这可以通过结合使用
keyof
运算符和Object.keys()
来提取与接口中定义的属性相匹配的对象的键来实现:基本上,
cleanObject
是一个泛型函数,它接受一个对象obj
和一个接口引用interfaceRef
。Object.keys()
方法用于提取obj
和interfaceRef
的键,并将它们转换为数组。keyof
操作符用于确保数组只包含与相应对象或接口的属性匹配的键。最后,使用循环比较
obj
的属性与interfaceRef
中定义的属性,如果obj
中的属性不存在于interfaceRef
中,则将其从obj
中删除。然后将清理后的对象作为函数的结果返回。
希望这能帮上忙...
ttp71kqs4#
您可以执行以下操作: