Spaces:
Running
Running
type RemoveFromTuple< | |
Tuple extends unknown[], | |
RemoveCount extends number, | |
Index extends 1[] = [] | |
> = Index["length"] extends RemoveCount | |
? Tuple | |
: Tuple extends [first: unknown, ...infer Rest] | |
? RemoveFromTuple<Rest, RemoveCount, [...Index, 1]> | |
: Tuple; | |
type ConcatTuples< | |
Prefix extends unknown[], | |
Suffix extends unknown[] | |
> = [...Prefix, ...Suffix]; | |
type ReplaceThis<T, NewThis> = T extends (this: infer OldThis, ...args: infer A) => infer R | |
? (this: NewThis, ...args: A) => R | |
: never; | |
type BindFunction< | |
TThis, | |
T extends (this: TThis, ...args: any[]) => any, // Allow specific types to propagate | |
TBoundArgs extends unknown[], | |
ReceiverBound extends boolean | |
> = ReceiverBound extends true | |
? (...args: RemoveFromTuple<Parameters<T>, TBoundArgs["length"] & number>) => ReturnType<ReplaceThis<T, TThis>> | |
: (...args: ConcatTuples<[TThis], RemoveFromTuple<Parameters<T>, TBoundArgs["length"] & number>>) => ReturnType<T>; | |
declare function callBind< | |
TThis, | |
T extends (this: TThis, ...args: any[]) => any, | |
TBoundArgs extends Partial<Parameters<T>> | |
>( | |
args: [fn: T, thisArg: TThis, ...boundArgs: TBoundArgs] | |
): BindFunction<TThis, T, TBoundArgs, true>; | |
declare function callBind< | |
TThis, | |
T extends (this: TThis, ...args: any[]) => any, | |
TBoundArgs extends Partial<Parameters<T>> | |
>( | |
args: [fn: T, ...boundArgs: TBoundArgs] | |
): BindFunction<TThis, T, TBoundArgs, false>; | |
export as namespace callBind; | |
export = callBind; | |