Open
Description
π Search Terms
strictBindCallApply this arg error
π Version & Regression Information
- This changed between versions 4.4 and 4.5
β― Playground Link
π» Code
export type CallbackA = (arg1: string, arg2: number) => number;
export type CallbackB = (arg1: string) => number;
interface Functions {
a: (arg1: string, callback: CallbackA) => number;
b: (arg1: string, callback: CallbackB) => number;
}
declare const functions: Functions;
export function create<T extends keyof Functions>(key: T): Functions[T] {
return (arg1: string, cb: CallbackA | CallbackA) => functions[key].call(undefined, arg1, cb)
}
declare let anyFunc: Functions[keyof Functions]
declare const cb: CallbackA | CallbackA;
anyFunc.call(undefined, "", cb)
π Actual behavior
The error message says:
The 'this' context of type '((arg1: string, callback: CallbackA) => number) | ((arg1: string, callback: CallbackB) => number)' is not assignable to method's 'this' of type '(this: undefined, args_0: string, args_1: CallbackA) => number'.
Type '(arg1: string, callback: CallbackB) => number' is not assignable to type '(this: undefined, args_0: string, args_1: CallbackA) => number'.
Types of parameters 'callback' and 'args_1' are incompatible.
Type 'CallbackA' is not assignable to type 'CallbackB'.
Target signature provides too few arguments. Expected 2 or more, but got 1.(2684)
Or:
The 'this' context of type '((arg1: string, callback: CallbackA) => number) | ((arg1: string, callback: CallbackB) => number)' is not assignable to method's 'this' of type '(this: undefined, args_0: string, args_1: CallbackA) => number'.
Type '(arg1: string, callback: CallbackB) => number' is not assignable to type '(this: undefined, args_0: string, args_1: CallbackA) => number'.(2684)
In neither example, this
is not the problem.
In fact, if you add this: void
to interface Functions
and then cast to void, you get this:
The 'this' context of type '((this: void, arg1: string, callback: CallbackA) => number) | ((this: void, arg1: string, callback: CallbackB) => number)' is not assignable to method's 'this' of type '(this: void, args_0: string, args_1: CallbackA) => number'.
Type '(this: void, arg1: string, callback: CallbackB) => number' is not assignable to type '(this: void, args_0: string, args_1: CallbackA) => number'.
Types of parameters 'callback' and 'args_1' are incompatible.
Type 'CallbackA' is not assignable to type 'CallbackB'.(2684)
Or even undefined
:
The 'this' context of type '((this: undefined, arg1: string, callback: CallbackA) => number) | ((this: undefined, arg1: string, callback: CallbackB) => number)' is not assignable to method's 'this' of type '(this: undefined, args_0: string, args_1: CallbackA) => number'.
Type '(this: undefined, arg1: string, callback: CallbackB) => number' is not assignable to type '(this: undefined, args_0: string, args_1: CallbackA) => number'.(2684)
None of these makes sense.
π Expected behavior
The message doesn't claim that this
is the problem; the problem is in other params.
If you go back to 4.4, you get a more reasonable error that simply complains about the callback param:
Argument of type 'CallbackA' is not assignable to parameter of type 'CallbackB'.(2345)
Additional information about the issue
Noticed this while attempting to enable strictBindCallApply
on our repo.