如何判斷一個對象是否符合 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 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦