我在打字稿中有一个abc类
export class ABC{
public a : any;
public b : any;
public c? : any;
public d? : any;
}
现在在我的函数中,我收到一个输入,可以说data:any
现在我想检查该输入即数据是否具有ABC类的所有必需属性。
是否可以在不对类ABC和对象数据的每个键使用hasOwnProperty
的情况下执行此操作。
答案 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运行时中永远不会传入无效的参数。