【发布时间】:2018-02-05 12:53:32
【问题描述】:
我正在尝试将 Typescript 映射类型用于简单的查询 API。让我提供一个简化的例子:
interface IRoot {
user: IUser,
trips: Array<ITrip>
}
interface IUser {
name: string
}
interface ITrip {
prop: string
}
现在我可以构造一个这样的查询:
class Query<T, K extends keyof T> {
constructor(
private rootType: T,
private subQueries?: {[P in K]?: Query<T[P], any> }) { }
}
这可以很好地访问用户,但无法解析旅行数组的类型:
new Query(({} as IRoot), {
user: new Query(({} as IUser), ... /* This is a query on User and is accepted here */,
trips: new Query(({} as ITrip), ... /* This is a query on Trip and TS will complain, since T[P] is Array<ITrip> */
})
任何想法如何扩展{[P in K]?: Query<T[P], any> } 以接受T[P] 或者如果T[P] 是一个数组,数组的类型?
【问题讨论】:
-
trips: new Query(({} as Array<ITrip>), ...不是你想要的吗? -
不,这会使 K 成为数组的属性,而不是 ITrip。相反,我想访问通过一对多关系链接的实体的道具。
-
不认为有办法做到这一点,但也许你可以创建一个
interface IQuery<T>,然后你可以有两个类Query<T, K extends keyof T>(implements IQuery<T>)和ArrayQuery<T, K extends keyof T>(实现IQuery<T[]>) -
你能把
IRoot中的trips定义为trips: Array<ITrip> | ITrip吗? -
@Arg0n 不幸的是不是,因为查询结果在某些时候也使用 T[P] 并且查询返回一个查询引用数组。
标签: typescript