TypeScript是否自动接受含目标类型全部属性的未声明子类型作为函数参数?
TypeScript类型兼容调用的合法性确认
我需要把TestInput类型的对象传入期望参数类型为CoordinatesMeta的quadrant方法,方法定义如下:
quadrant(c:CoordinatesMeta) {}
TestInput类型拥有CoordinatesMeta的所有属性,请问是否需要向TypeScript额外声明,才能让quadrant(t)(t为TestInput类型)的调用合法?毕竟t已经具备了方法所需的全部属性。
以下是最小可复现代码示例:
interface Center { x: number; y: number; } interface MetaCoordinates { x: number; y: number; c: Center; } declare function quadrant(MC: MetaCoordinates): number; interface TestInput { x: number; y: number; c: Center; q: number; } const c: Center = Object.freeze({ x: 100, y: 100 }); const input: TestInput = { x: 99, y: 100, c, q: 1 }; console.log(quadrant(input));
这种用法的语义完全正确,不需要额外声明。
TypeScript采用结构类型系统,核心判断逻辑是:只要一个值的结构完全满足目标类型的所有要求(包含目标类型的全部属性,且属性类型匹配),就可以被赋值给该类型的变量或参数,无需两者有显式的继承或实现关系。
在你的示例中,TestInput包含了MetaCoordinates要求的所有属性(x、y、c),且每个属性的类型都与MetaCoordinates定义一致,即使TestInput多了额外的q属性,也不影响类型兼容性。因此quadrant(input)的调用完全合法,TypeScript会自动认可这种类型兼容,不需要额外的类型断言或声明。
内容的提问来源于stack exchange,提问作者Ole
相关产品推荐
相关产品推荐

