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

如何判断一个对象是否符合 TypeScript 接口 —— 跟进篇

有些评论者指出我的最近的一个解决方案是不正确的。他们是对的。我多下了一番功夫,把它解决了。为了我亲爱的读者们,我愿意做任何事情!

我当前的解决方案是这样的:

    const 判断是否为TS接口 = <T>(值: any, keys: (keyof T)[], requiredKeys: (keyof T)[]): 值是T => {  
        if (typeof 值 !== 'object' || 值 === null)  
            return false;  

        return(  
            requiredKeys.every(键 => 键 in 值) &&                              // 确保所有必需的属性都存在  
            (Object.keys(值) as (keyof T)[]).every(键 => keys.includes(键))    // 确保没有额外的键存在  
        );  
    }

这里教你用它:

    接口 Cat {  
      name: string;  
      color: 'tabby' | 'calico' | 'black' | 'white' | 'bald';  
      小猫数量?: number;  
    }  

    const invalidCat = {  
      name: 'Nyako',  
      color: 'white',  
      ownerName: 'Power' // 主人名字  
    }  

    const properCat = {  
      name: 'Chomosuke',  
      color: 'black'  
    }  

    console.log(isTSInterface<Cat>(  
      invalidCat,   
      ['name', 'color', '小猫数量'],   
      ['name', 'color']  
    ));  // 会返回 false  

    console.log(isTSInterface<Cat>(  
      properCat,   
      ['name', 'color', '小猫数量'],   
      ['name', 'color']  
    ));  // 会返回 true

该函数会检查传入的值,并返回一个布尔值,表示该值是否符合接口规范。所有可能的接口字段名称作为第一个字符串数组传递,必需字段名称作为第二个参数传递。我没有发现其他可靠的方法来“识别”它们。如果你有更好的方法,请在评论中分享!

null值有点让人困惑,因为null可能实现某个接口,也可能不实现。例如,这种情况是有效的,即这个null应该能通过验证器,而普通的null是通不过的:

    const cat = null as Cat;

这里将 cat 变量初始化为 null,并指定其类型为 Cat

我决定对于所有 null 值返回 false。毕竟,你又能从一个 null 中检查出什么呢?如果值为 null,直接不调用验证函数即可。我认为没有好的方法来验证一个 null 是否满足某个接口的要求。如果你有好的方法,请在评论中分享!

首先,该函数检查对象是否拥有所有必要的键。然后检查是否有任何键不在接口定义中。如果两项检查都通过,则返回 true

希望2.0版本更对你们的胃口!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消