Typescript 将参数类型传递给同一个函数会导致编译器错误
我想用另一个调用包装一个函数,而不必编写原始函数的所有定义。在本例中,原始方法定义了30多个重载,我不想确保我的重载和它们的定义保持最新。此外,返回类型取决于给定的参数,因此我无法在这方面真正实现快捷方式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,
// 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));
}
}