Typescript 将参数类型传递给同一个函数会导致编译器错误

Typescript 将参数类型传递给同一个函数会导致编译器错误,typescript,Typescript,我想用另一个调用包装一个函数,而不必编写原始函数的所有定义。在本例中,原始方法定义了30多个重载,我不想确保我的重载和它们的定义保持最新。此外,返回类型取决于给定的参数,因此我无法在这方面真正实现快捷方式 // A function from a library with some overloads, note that the return type is dependent on the function arguments declare function foo<TState,

我想用另一个调用包装一个函数,而不必编写原始函数的所有定义。在本例中,原始方法定义了30多个重载,我不想确保我的重载和它们的定义保持最新。此外,返回类型取决于给定的参数,因此我无法在这方面真正实现快捷方式

// A function from a library with some overloads, note that the return type is dependent on the function arguments
declare function foo<TState, T>(
  state: TState,
  project: (state: any) => T): T;
declare function foo<TState1, TState2, T>(
  s1: TState1,
  s2: TState2,
  project: (s1: TState1, s2: TState2) => T): T;

// The function I want to make, uses the original with a minor change
function bar<T extends Parameters<typeof foo>>(...args: T) {
  return new Promise(resolve => setTimeout(() => {
    resolve(foo(...args));
             // ^^^^^^^ ts(2556): Expected 2-3 arguments, but got 0 or more.
  }));
}
所以我只想用
this.store.select来包装
createSelector
,因为在这个上下文中,我们已经知道了这个存储,不再需要在任何派生类中包装它,从而使代码更加简洁

相关问题

    • 不起作用,因为它假定固定返回类型独立于参数,但实际情况并非如此
    • 同上

我在TypeScript Github上创建了一个问题:

他们的回答是:

参数基于条件类型中的类型推断,条件类型中的类型推断不支持重载:

这是已知的设计限制


所以我要回答:不,我想做的是不可能的。

在我看来像个bug。将调用更改为
foo
以使用
.apply
(例如
返回foo.apply(this,args).getUTCDate();
)效果很好。确实如此-请参阅
export abstract class FeatureQuery {
  public constructor(protected store: Store<any>) {}

  /* other useful methods */

  protected selectFrom<T extends Parameters<typeof createSelector>(...args: T) {
    return this.store.select(createSelector(...args));
  }
}