Javascript 检查对象是否具有typescript中类的所有属性
我有一门打字的abc课Javascript 检查对象是否具有typescript中类的所有属性,javascript,node.js,typescript,Javascript,Node.js,Typescript,我有一门打字的abc课 export class ABC{ public a : any; public b : any; public c? : any; public d? : any; } 现在在我的函数中,我收到一个输入,比如说data:any 现在我想检查输入即数据是否具有ABC类的所有必需属性。 是否有任何选项可以在不使用类ABC和对象数据的每个键的情况下执行此操作。实例化该类以获取所有属性,并使用every函数检查所有键是否确实在传递的对象中 fu
export class ABC{
public a : any;
public b : any;
public c? : any;
public d? : any;
}
现在在我的函数中,我收到一个输入,比如说data:any
现在我想检查输入即数据是否具有ABC类的所有必需属性。
是否有任何选项可以在不使用类ABC和对象数据的每个键的情况下执行此操作。实例化该类以获取所有属性,并使用every函数检查所有键是否确实在传递的对象中
function hasAllProperties (data, YourClass) {
const yourClass = new YourClass()
return Object.keys(yourClass).every((key) => data[key] !== undefined)
}
用法
TL;DR.使用
hasOwnProperty
很可能是不可避免的,除非您对函数的使用有绝对的把握,否则函数的输入数据源是完全可控的
较长版本:
您必须理解静态类型检查和运行时检查的区别。TS是一个静态类型检查器,但它没有运行时。TS中的代码在执行之前传输到JS,并在JS运行时引擎中运行
TS检查数据
的属性是否满足要求的唯一方法是,类型系统中必须首先存在一条信息。但是在您的例子中,data:any
已经吞没了所有有意义的类型信息,没有留下任何可处理的内容
即使data
的类型更具体,比如data:{a:any;b:any;}
等。TS只能检查在代码库中,您没有显式编写任何传递无效参数的代码
如果您在某处写入validate(anyData)
,其中anyData:any
,则安全防护装置不见了。另外,它不能保证在JS运行时,永远不会传入无效参数
hasAllProperties(data, ABC)