能否将extends T用作返回类型?如何定义接受接口子类的字段类型?
解决方案
你的需求完全可以实现,在TypeScript里有两种常用的实现方式,具体说明如下:
方式一:直接使用父接口类型(最简洁)
TypeScript中,继承父接口的子类型天然兼容父接口,所以你不需要写Person | T extends Person这种错误语法,直接把owner的类型设为Person即可。任何实现或继承Person的类型(比如Superman)都能赋值给这个字段,和你想要的GraphQL接口机制效果一致。
示例代码:
interface Person { name: string } interface Superman extends Person { clothes: string } interface Home { address: string owner: Person // 直接用父接口类型即可 } // 合法:用Person类型赋值 const commonHome: Home = { address: 'Main St 123', owner: { name: 'Alice' } } // 合法:用Superman类型赋值(因为Superman继承了Person) const superHome: Home = { address: 'Fortress of Solitude', owner: { name: 'Clark Kent', clothes: 'Red & Blue Cape' } }
方式二:泛型接口(明确约束子类型)
如果需要让Home接口的owner字段明确绑定某个具体的Person子类型,可以使用泛型,通过T extends Person约束泛型的范围:
示例代码:
interface Person { name: string } interface Superman extends Person { clothes: string } // 泛型接口,约束T必须是Person的子类型 interface Home<T extends Person> { address: string owner: T } // 指定owner为Superman类型 const superHome: Home<Superman> = { address: 'Fortress of Solitude', owner: { name: 'Clark Kent', clothes: 'Red & Blue Cape' } } // 指定owner为Person类型 const commonHome: Home<Person> = { address: 'Main St 123', owner: { name: 'Alice' } }
为什么你原来的写法不行?
你写的owner: Person | T extends Person是TypeScript语法错误,不符合类型定义规则。TypeScript中表示“某个类型或其子类型”,要么利用类型兼容性直接用父类型,要么用泛型约束实现更精确的类型绑定。
内容的提问来源于stack exchange,提问作者Wallace
相关产品推荐
相关产品推荐

