假设我有以下代码:
const selectors = {
posts: {
getAllPosts(): Post[] {
return database.findPosts();
},
getPostsWithStatus(status: Post["status"]) {
return database.findPosts({ status });
}
},
users: {
getCurrentUser(): User {
return database.findUser();
}
}
};
我想创建一个调用其中一个嵌套方法的函数,以便执行以下操作:
const deletedPosts = select("posts", "getPostsWithStatus", ["deleted"]);
到目前为止,我的实现如下:
type Selectors = typeof selectors;
function select<
SelectorType extends keyof Selectors,
SelectorFn extends keyof Selectors[SelectorType]
>(
selectorType: SelectorType,
selectorFn: SelectorFn,
args: Parameters<Selectors[SelectorType][SelectorFn]>
): ReturnType<Selectors[SelectorType][SelectorFn]> {
return selectors[selectorType][selectorFn](...args);
}
调用函数时会正确推断类型,但实现本身会引发错误:
args: Parameters<Selectors[SelectorType][SelectorFn]>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
键入{posts:{getAllPosts():Post[];getPostsWithStatus(状态:"已删除"|未定义):never[];};用户:{getCurrentUser():用户;};}[SelectorType][SelectorFn]'不满足约束'(…参数:any)=>;"任何".
): ReturnType<Selectors[SelectorType][SelectorFn]> {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
键入{posts:{getAllPosts():Post[];getPostsWithStatus(状态:"已删除"|未定义):never[];};用户:{getCurrentUser():用户;};}[SelectorType][SelectorFn]'不满足约束'(…参数:any)=>;"任何".
return selectors[selectorType][selectorFn](...args);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
此表达式不可调用.
所以我的问题是,如何创建一个函数,在保留类型的同时动态调用嵌套在对象中的另一个函数?