为了账号安全,请及时绑定邮箱和手机立即绑定

验证javascript类结构的通用方法

验证javascript类结构的通用方法

噜噜哒 2021-08-20 18:11:02
所以我有一个提供者类export class Provider {    activeAccount: boolean;    description: String;    name: String;    providerType: any;    publicUrl: String;    uuid: String;    isValidStructure(obj){        let keys = Object.keys(obj), valid = true,        properties = ['activeAccount', 'description', 'name', 'providerType', 'publicUrl', 'uuid']        keys.forEach((key)=>{            if(!properties.includes(key)){                valid = false            }        })        return valid    }}我有一种方法来验证用于创建模型的数据是模型的属性,它可以工作,但是否有通用的方法来做到这一点属性数组被硬编码在函数 isValidStructure 中        let validData: any = {name: 'some name'}        let invalidData: any = {namexx: 'the key is invalid'}        let provider = Object.assign(new Provider(), validData)        let provider2 = Object.assign(new Provider(), invalidData)        provider.isValidStructure(validData)//true        provider2.isValidStructure(invalidData)//false以上是函数及其输出的一些示例 是否有某种方法可以获取类的属性
查看完整描述

2 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

您可以定义一个接口,该接口具有类和传入的配置之间的所有公共属性obj,然后让您的类实现它,并且您的构造函数将该类型作为参数。


export interface IProvider {

    activeAccount?: boolean;

    description?: String;

    name?: String;

    providerType?: any;

    publicUrl?: String;

    uuid?: String;

}


export class Provider implements IProvider {

    activeAccount: boolean;

    description: String;

    name: String;

    providerType: any;

    publicUrl: String;

    uuid: String;


    constructor(obj?: IProvider) {

        if (obj) {

            this.activeAccount = obj.activeAccount;

            ...

        }

    }


}


const provider = new Provider({...});

更新


如果不需要/任何属性,您可以在属性?名称和冒号之间的接口中添加一个。这样你就可以允许构造函数 obj 拥有它需要的尽可能多的有效道具,但如果你尝试传入它仍然会引发错误:


const provider = new Provider({ invalid: true });

查看打字稿接口了解更多信息


更新 2


把它放回到你原来的例子中:


let validData: any = {name: 'some name'}

let invalidData: any = {namexx: 'the key is invalid'}

let provider = Object.assign(new Provider(), validData)

let provider2 = Object.assign(new Provider(), invalidData)

定义两者validData和invalidDataasany将迫使 Typescript 不会用红色波浪线对你大喊大叫,因为它基本上是说“这可能是一个IProvider”。所以你应该设置validData: IProvider而不是any.


此外,Object.assign()将道具添加到类实例时也会发生同样的事情。如果您这样做,Typescript 似乎并不介意您尝试放入无效的道具:


const validData: IProvider = { name: 'some name' };

const invalidData: any = { namexx: 'the key is invalid' };

const provider: Provider = Object.assign(new Provider(validData), invalidData);


// Provider { name: 'some name', namexx: 'the key is invalid' }

但是,如果您再次更改any为IProvideron invalidData: IProvider,它会因为namexx那里的道具而对您大喊大叫。


话虽如此,既然输入和验证对你来说似乎很重要,那么你应该尝试确保所有类型都被明确声明以允许 Typescript 做它所做的事情。


查看完整回答
反对 回复 2021-08-20
  • 2 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信