如何在TypeScript中实现接口多态?解决子类型赋值报错
TypeScript中父接口属性接受子类型的正确实现方式
你遇到的问题是TypeScript的额外属性检查导致的:当直接把包含prop1的对象字面量赋值给parent类型时,编译器会严格校验,因为parent接口里没有定义prop1,字面量的额外属性会触发报错。下面是几种可行的解决方法:
方法1:显式断言为子类型
用as将字面量断言为对应的子接口类型,告诉编译器这个对象确实是child1类型:
interface parent { common: string; } interface child1 extends parent { prop1: string; } interface child2 extends parent { prop2: string; } interface SomeObject { member: parent; } let a: SomeObject = { member: { common: "a", prop1: "b" } as child1 }
方法2:先定义子类型变量再赋值
先创建一个标注为子类型的变量,再把它赋值给member。因为子类型本身兼容父类型,编译器不会报错:
const childInstance: child1 = { common: "a", prop1: "b" }; let a: SomeObject = { member: childInstance };
方法3:将member类型改为子类型联合
如果SomeObject的member只接受child1或child2,直接把类型设为child1 | child2,这样字面量赋值时编译器会自动匹配对应的子类型:
interface SomeObject { member: child1 | child2; } let a: SomeObject = { member: { common: "a", prop1: "b" } };
补充说明
TypeScript的结构类型系统中,子类型是兼容父类型的,但对象字面量的赋值有特殊的额外属性检查逻辑——这是为了防止意外的拼写错误。上面的几种方法都是通过明确类型信息,让编译器认可这个对象是合法的父类型/子类型实例。
内容的提问来源于stack exchange,提问作者Moshe Shaham
相关产品推荐
相关产品推荐

