TypeScript代码未触发预期类型错误,是遗漏了什么配置吗?
问题原因分析
第一处:observe方法实现不符合定义却无报错
TypeScript的函数类型兼容规则默认允许实际实现的函数参数数量少于类型定义的参数数量。
你在EntityModel<T>中定义的observe方法类型为(eventName:EventNames, handler:EventHandler<T>)=>void,而实际实现的observe仅接收1个eventName参数。这种写法在TS中属于合法兼容场景:即使调用方按照类型约定传入了第二个handler参数,你的实现不使用该参数也不会触发运行时错误,因此编译器不会抛出异常。
第二处:传入的箭头函数不符合EventHandler<T>定义却无报错
和上面的兼容规则完全一致:EventHandler<T>要求函数接收context和next两个参数,你传入的箭头函数未定义任何入参,属于「参数数量少于类型要求」的合法情况,编译器不会报错。
这个设计是为了兼容JS常见开发习惯,比如你调用数组map方法时,只需要写arr.map(item => item * 2),不需要显式声明index和原数组两个入参,TS也不会报错,底层逻辑完全相同。
补充说明
即使你开启tsconfig的strict和strictFunctionTypes配置,也不会触发该场景的报错,这是TypeScript有意设计的兼容特性,不属于BUG。
内容的提问来源于stack exchange,提问作者TheDevGuy
相关产品推荐
相关产品推荐

