vue 进行 props 类型检查用 instanceof 不会有问题吗?-灵析社区

CO_co

在查阅官方文档时注意到 props 类型检查这一章节。 [https://cn.vuejs.org/guide/components/props.html#prop-validation](https://link.segmentfault.com/?enc=sjAwRIR40DwjKhguod691g%3D%3D.AE%2FOjaZndveHONOxIGYwMKDW3hxKVLM4xrgMFaVZu5uVpoaeCP6es3%2BK7McRk%2FX0MUx5%2B9HgZV8fdOD5ecbpxONdnUYV2L%2BYkQbUnCNDGTA%3D) ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250103/7e4bec0a8a570a7d834405959059ae08.png) * * * 此时按照官方的说法 ![image.png](https://wmprod.oss-cn-shanghai.aliyuncs.com/images/20250103/1c33bce2958c091ac2ea6de43ad02980.png) 不会有这样的问题吗? const props=defineProps({ name:Array }); props.name instanceof Array // true props.name instanceof Object // true

阅读量:223

点赞量:16

问AI
不能说毫无风险。 但风险并不在于你说的这一点,你列举的这一类问题会在框架层面得到解决,不会把烂摊子留给开发者。亲手实现过深度拷贝的人大抵都知道必须先检测是否为 "RegExp"、"Array"、"Date" 等内置对象,确定不是这些对之后,才能按照 "Object" 来处理,框架的解决方案应该与此类似。 "incetanceof" 检测存在的可能风险在于 JS 写法过于灵活,以至于子类属性与超类的同名属性可以不兼容,"incetanceof"并不能检测出这种改动: class TaniedArray extends Array{ forEach(){ return null } get map(){ return null } } const taniedArray = new TaniedArray(1,2,3,4,5); console.log(taniedArray incetanceof Array); // true taniedArray.map(i=>i); // 报错 «👆 这里子类的 "forEach" 与 "map" 与超类的同名方法不同("map"甚至已经不再是方法了),假如 Vue 试图调用"taniedArray.map",就会报错。 这种改动难以检测,即便使用 AI 推荐的 "Array.isArray" 方法来检测,依旧无法发现问题。» 对 JS 而言,这种问题是无解的,因为这种改动难以约束,也那一检测,因此避免这种问题,只能指望开发者自己不要乱来。