【发布时间】:2019-07-15 12:33:20
【问题描述】:
假设我正在编写一些数据库接口,我可以使用它一次提交多个查询,作为由表名作为键的对象,并期望接收一个对象,其结果与查询中的键相同。
interface Query {
users?: UsersQuery
products?: ProductsQuery
orders?: OrdersQuery
}
interface Result {
users?: User[]
products?: Product[]
orders?: Order[]
}
declare function readData(query: Query): Result;
有没有什么方法可以根据传入的对象中实际存在的键来更具体地确定返回类型?
似乎我很接近这样的事情:
declare function readData<T extends Query>(query: T): { [K in keyof T]: T[K] }
但不是使用T[K] 的映射返回类型,我需要它使用Result[K],它不能编译(使用error TS2536: Type 'K' cannot be used to index type 'Result')。根据文档,我猜这是因为 T[K] 以外的任何东西都不是同态的,尽管我对此不是很清楚。
在使用映射类型时我在这里缺少什么,或者有其他方法可以做到这一点吗?
【问题讨论】:
-
总是有助于纠正错误。 “不编译”不是表达您面临的问题的好方法。包括您尝试的全部内容和实际错误消息。
Result[K]方法是在正确的道路上.. -
谢谢,我添加了编译器错误以供将来参考。就像您输入的答案一样,这是因为 T 可能具有 Result 上可能不存在的额外属性。
标签: typescript