在泛型函数中使用元组类型时,如何“扩展”源类型?
假设我们想要创建一个 RxJS 映射运算符,它返回源可观察值以及另一个映射值:
export function mapExtended<T, R>(mapping: (input: [T]) => R): OperatorFunction<[T], [T, R]>;
export function mapExtended<T1, T2, R>(mapping: (input: [T1, T2]) => R): OperatorFunction<[T1, T2], [T1, T2, R]>;
export function mapExtended<T1, T2, T3, R>(mapping: (input: [T1, T2, T3]) => R): OperatorFunction<[T1, T2, T3], [T1, T2, T3, R]>;
export function mapExtended<R>(mapping: (input: any) => R): OperatorFunction<any, {}> {
return (source$: Observable<any>) => source$.pipe(
map(input => {
const mappingResult = mapping(input);
return [...input, mappingResult];
}),
);
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但未正确检测到过载。的返回类型test是, …
我试图定义一个类型,它获取一个函数类型作为泛型参数,并返回一个与输入函数类型相同的函数类型,只是它最后多了一个参数:
type AugmentParam<F extends (...args: any[]) => any, ExtraParam> = F extends (
...args: infer Args
) => infer R
? (
...args: [
...Args,
ExtraParam
]
) => R
: never
Run Code Online (Sandbox Code Playgroud)
用法示例:
type F = (x: number) => boolean
type F2 = AugmentParam<F, string> // (x: number, arg2: string) => boolean
Run Code Online (Sandbox Code Playgroud)
...Args 似乎不起作用,但是如果我将其更改为这样的内容,它会起作用:
type F = (x: number) => boolean
type F2 = AugmentParam<F, string> // (x: number, arg2: string) => boolean
Run Code Online (Sandbox Code Playgroud)
但它只适用于特定数量的参数,我需要为每个 n 元函数定义一个这样的类型。