TypeScript中父interface是否可获取子interface的属性?
问题结论
你给出的代码写法不符合TypeScript语法规则,执行编译时会直接抛出类型错误。
具体原因说明
- TypeScript针对直接赋值的对象字面量有严格的「额外属性检查」规则:当你直接把一个对象字面量赋值给标注了明确类型的变量时,TS会校验对象字面量的所有属性是否都存在于标注的类型定义中,只要出现未定义的属性就会报错。你示例中
interface A没有定义author属性,直接给标注为A的book常量传带author的对象字面量,会触发报错:对象字面量只能指定已知属性,并且“author”不存在于类型“A”中。 - 子接口继承父接口后,子类型本身是符合父类型的结构要求的(包含父类型的全部属性),所以如果是先声明子类型的变量,再赋值给父类型的变量,是完全合法的,不会触发报错,示例如下:
interface A { title: string; id: string; } interface B extends A { author: string; } // 先声明B类型的变量 const bBook: B = { title: 'my title', id: '1', author: 'author' } // 赋值给A类型的变量,合法 const book: A = bBook
- 另外父接口的定义是独立的,不会自动继承子接口的属性,如果你需要复用子接口的属性给父类型使用,可以用交叉类型实现,比如要得到一个同时包含A的属性和B的author属性的类型,可以写:
type AWithAuthor = A & Pick<B, 'author'>
内容的提问来源于stack exchange,提问作者Younes
相关产品推荐
相关产品推荐

