Javascript 检查对象是否具有typescript中类的所有属性

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

我有一门打字的abc课

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)