为什么TypeScript实现类时不强制匹配interface方法签名要求?
结论
这是TypeScript的预期默认行为,你没有遗漏基础配置,问题核心是TypeScript默认的函数参数类型兼容性规则。
原因解释
TypeScript默认对函数参数采用「双变(Bivariance)」兼容规则:允许实现函数的参数类型比接口定义的参数类型更窄。
这个设计是为了兼容JavaScript常见的开发习惯:比如调用Array.prototype.forEach时,大部分开发者只会写用到的第一个参数item,而非完整的三个参数(item, index, array),如果严格要求参数类型和数量完全匹配,这类写法都会触发编译错误,对JavaScript迁移的用户不友好。
你遇到的运行时报错就是该规则的副作用:实现类收窄了参数类型,但是调用方按照接口定义传入了更宽范围的参数,运行时就会出现方法/属性不存在的问题。
解决方案
开启TypeScript编译配置中的strictFunctionTypes即可强制校验函数参数的逆变兼容性:
- 该规则要求实现函数的参数类型只能比定义更宽,不能更窄,开启后你给出的
NumberStuff和StringStuff都会直接触发编译错误,不会把问题留到运行时。 strictFunctionTypes已经包含在strict配置集中,如果你的项目已经开启"strict": true,默认就会启用该校验。
你只需要在tsconfig.json中添加如下配置即可:
{ "compilerOptions": { "strictFunctionTypes": true } }
内容的提问来源于stack exchange,提问作者doup
相关产品推荐
相关产品推荐

