检查对象是否具有打字稿中类的所有属性

时间:2020-09-26 14:28:31

标签: javascript node.js typescript

我在打字稿中有一个abc类

export class ABC{
    public a : any;
    public b : any;
    public c? : any;
    public d? : any;
}

现在在我的函数中,我收到一个输入,可以说data:any 现在我想检查该输入即数据是否具有ABC类的所有必需属性。 是否可以在不对类ABC和对象数据的每个键使用hasOwnProperty的情况下执行此操作。

2 个答案:

答案 0 :(得分:0)

实例化该类以获取所有属性,并使用每个函数检查所有键是否确实在传递的对象中。

function hasAllProperties (data, YourClass) {
  const yourClass = new YourClass()
  return Object.keys(yourClass).every((key) => data[key] !== undefined)
}

用法

hasAllProperties(data, ABC)

答案 1 :(得分:0)

TL; DR。使用hasOwnProperty很可能是不可避免的,除非您完全确定函数的用法,否则函数的输入数据源将完全受到控制。

长版:

您必须了解静态类型检查运行时检查的区别。 TS是静态类型检查器,但没有运行时。 TS中的代码在执行之前会先转换为JS,然后在JS运行时引擎中运行。

TS可以检查data的属性是否满足要求的唯一方法是,该信息必须首先存在于类型系统中。但是在您的情况下,data: any吞没了所有有意义的类型信息,而使TS毫无用处。

即使data的类型更具体,例如data: { a: any; b: any; }等。TS只能检查,在代码库中,您没有明确编写任何传递无效参数的代码

如果您在某个地方写了validate(anyData),在anyData: any那里,那么安全防护就不见了。另外,它不能保证在JS运行时中永远不会传入无效的参数。