Closed
Description
TypeScript Version: 2.5.2
Repo with demo
Typescript Playground
Code
class Foo {
private result: number = 42;
public func(this: Foo): number {
return this.result;
}
}
function action(): void {
console.log("Hello world!");
}
function bar(callbackFn: (this: void) => any, thisArg?: undefined): any;
function bar<T>(callbackFn: (this: T) => any, thisArg: T): any;
function bar<T, TResult>(callbackFn: (this: T) => TResult, thisArg: T): TResult {
return callbackFn.call(thisArg);
}
const foo = new Foo();
const obj = new Object();
bar(action); // success - ok
bar(() => action()); // success - ok
bar(function() { return action(); }); // success - ok
bar(action, foo); // success - NOT ok, expected ERROR
bar(() => action(), foo); // success - NOT ok, expected ERROR
bar(function() { return action(); }, foo); // success - NOT ok, expected ERROR
bar(action, obj); // success - NOT ok, expected ERROR
bar(() => action(), obj); // success - NOT ok, expected ERROR
bar(function() { return action(); }, obj); // success - NOT ok, expected ERROR
bar(foo.func); // ERROR - ok
bar(() => foo.func()); // success - NOT ok, expected ERROR
bar(function() { return foo.func(); }); // success - NOT ok, expected ERROR
bar(foo.func, foo); // success - ok
bar(() => foo.func(), foo); // success - ok
bar(function() { return foo.func(); }, foo); // success - ok
bar(foo.func, obj); // success - ok
bar(() => foo.func(), obj); // success - ok
bar(function() { return foo.func(); }, obj); // success - ok
bar(obj.toString); // success - NOT ok, expected ERROR
bar(() => obj.toString()); // success - NOT ok, expected ERROR
bar(function() { return obj.toString(); }); // success - NOT ok, expected ERROR
bar(obj.toString, foo); // success - NOT ok, expected ERROR
bar(() => obj.toString(), foo); // success - NOT ok, expected ERROR
bar(function() { return obj.toString(); }, foo); // success - NOT ok, expected ERROR
bar(obj.toString, obj); // success - ok
bar(() => obj.toString(), obj); // success - ok
bar(function() { return obj.toString(); }, obj); // success - ok
Expected behavior:
bar(action, foo); // ERROR
bar(() => action(), foo); // ERROR
bar(function() { return action(); }, foo); // ERROR
bar(action, obj); // ERROR
bar(() => action(), obj); // ERROR
bar(function() { return action(); }, obj); // ERROR
bar(() => foo.func()); // ERROR
bar(function() { return foo.func(); }); // ERROR
bar(obj.toString); // ERROR
bar(() => obj.toString()); // ERROR
bar(function() { return obj.toString(); }); // ERROR
bar(obj.toString, foo); // ERROR
bar(() => obj.toString(), foo); // ERROR
bar(function() { return obj.toString(); }, foo); // ERROR
Actual behavior:
bar(action, foo); // success
bar(() => action(), foo); // success
bar(function() { return action(); }, foo); // success
bar(action, obj); // success
bar(() => action(), obj); // success
bar(function() { return action(); }, obj); // success
bar(() => foo.func()); // success
bar(function() { return foo.func(); }); // success
bar(obj.toString); // success
bar(() => obj.toString()); // success
bar(function() { return obj.toString(); }); // success
bar(obj.toString, foo); // success
bar(() => obj.toString(), foo); // success
bar(function() { return obj.toString(); }, foo); // success