首页 > 解决方案 > 为什么 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 而没有抱怨的类?这是一个错误吗?还是出于某种原因设计的?或者我可以用一些标志启用它吗?

标签: typescriptdowncast

解决方案


链接的副本解释了这种情况。对于您上面的代码,修复可能是使用--strictFunctionTypes并将您的方法签名编写为函数值属性签名:

interface InspectorClass{
    inspect: (v:Vehicle) => void
}

游乐场链接


推荐阅读