验证javascript类结构的通用方法

所以我有一个提供者类


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

以上是函数及其输出的一些示例 是否有某种方法可以获取类的属性


噜噜哒
浏览 131回答 2
2回答

饮歌长啸

您可以定义一个接口,该接口具有类和传入的配置之间的所有公共属性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 做它所做的事情。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript