在 TypeScript 3.0 之前,推断 N 元函数的类型涉及为已知的泛型参数创建任意数量的函数重载,然后使用any
类型化的剩余参数之类的东西编写函数实现。TypeScript 3.0 改变了这一点,因此泛型类型可以扩展any[]
,它充当泛型元组。
这种更改对我来说很有意义,并且对我自己的泛型参数来说效果很好,但是我无法像在 3.0 之前那样让类型流经返回类型。
这是一个例子:
const takeToPromise = <T>(obs$: Observable<T>): Promise<T> =>
obs$.pipe(take(1)).toPromise();
export function resolveObservables(): Promise<any[]>;
export function resolveObservables<T1>(o1: Observable<T1>): Promise<[T1]>;
export function resolveObservables<T1, T2>(o1: Observable<T1>, o2: Observable<T2>): Promise<[T1, T2]>;
export function resolveObservables<T1, T2, T3>(o1: Observable<T1>, o2: Observable<T2>, o3: Observable<T3>): Promise<[T1, T2, T3]>;
// Etc on the overloads
export function resolveObservables(...obs: (Observable<any>)[]): Promise<any[]> {
return Promise.all(obs.map(takeToPromise));
}
假设我只有 3 个重载(最多T3
)。如果我resolveObservables
通过将数组传播到函数调用中来使用,在 TS 3.0 中,我会得到一个错误:
预期有 0-3 个参数,但有 0 个或更多。
我可以将它与固定的 arity 调用一起使用,但是一旦我尝试传播,就会出错。任何使这项工作的尝试都以某种方式失败了。例如:
export function resolveObservables<T, U extends Observable<T>[]>(...obs: U): Promise<T[]>;
将无法捕获任何类型(类型为{}
)。
有什么方法可以修改这些类型,这样我就可以在不失去使用扩展参数的能力的情况下让类型流过?在我使用传播的情况下,我并不真正关心类型,如果我这样做了,我假设我可以只使用元组类型。但是根据我到目前为止的尝试,我可以使用传播但丢失类型,或者有类型但不能使用传播。
我在这里想念什么?