-
Notifications
You must be signed in to change notification settings - Fork 13.1k
Closed
Description
TypeScript Version: 2.6.1
Code
class Foo {
bar(): void {
console.log(this.x);
}
}
class Bar extends Foo {
x: Number;
constructor() {
super();
this.x = 2;
}
bar() {
super.bar();
(super.bar as any)();
}
}
let b = new Bar();
b.bar()Expected behavior:
I expect that the code generated for super.bar() and (super.bar as any)() behave the same - this code should console.log(2) twice.
Actual behavior:
The code logs 2, and then undefined.
The underlying issue is that super.bar() and (super.bar as any)() compile to different code. the former compiles to _super.prototype.bar.call(this);, but the as any changes the compilation to _super.prototype.bar();, and so super.bar is called with the wrong this when the cast is in place.
I was generally under the impression that code generation should be the same whether or not casts were present in the code, so I found this a bit surprising. that said, it was easy to change my code to avoid this pitfall.
aluanhaddad, pbondoer and kube
Metadata
Metadata
Assignees
Labels
BugA bug in TypeScriptA bug in TypeScript