typescript - 为什么 TypeScript 允许在方法参数中隐式向下转换?
问题描述
这是示例:
interface Vehicle{
mass:number
}
interface InspectorClass{
inspect(v:Vehicle):void
}
class Car implements Vehicle{
mass = 2000
wheels = 4
}
class Boat implements Vehicle{
mass = 3000
sails = 2
}
// with methods it silently fails:
class BoatInspector implements InspectorClass{
inspect(v:Boat){ // interface contract silently violated!!!
console.log(v.mass)
console.log(v.sails)
}
}
function runInspection(inspector:InspectorClass, vehicle:Vehicle){
inspector.inspect(vehicle)
}
let myCar = new Car()
let myBoatInspector = new BoatInspector()
runInspection(myBoatInspector, myCar)
// with functions it checks properly:
type InspectorFunction = (v:Vehicle) => void
const inspectCar:InspectorFunction = function(v:Car){ // TypeScript complains as it should
console.log(v.mass)
console.log(v.wheels)
}
接口契约规定 InspectorClass 实例中的检查方法必须能够检查任何类型的车辆。为什么 TypeScript 让我实现一个实际上只接受 Boats 而没有抱怨的类?这是一个错误吗?还是出于某种原因设计的?或者我可以用一些标志启用它吗?
解决方案
链接的副本解释了这种情况。对于您上面的代码,修复可能是使用--strictFunctionTypes
并将您的方法签名编写为函数值属性签名:
interface InspectorClass{
inspect: (v:Vehicle) => void
}
推荐阅读
- python - 更改季度格式
- java - /login 路由下载文件而不是运行回调 [Java Spark]
- node.js - 尝试访问 Razorpay Payments API 时出现 CORS 错误
- node.js - 如何通过 AWS Lambda 函数路由来自 NodeJS API 的请求并将其用作代理?
- node.js - 如何在基于神经网络的异或门中生成训练数据
- django - 在 django 中显示数据库中的单个项目
- c - 自由函数激活断点
- html - 选择并输入相同的高度
- javascript - 基于 SVG/鼠标位置的定位 Bootstrap 弹出框
- math - 当你不能有 0 和你不能有 1 时,它叫什么?