When there are property assignments in a the class body of an inheriting
class, tsc current emit the following compilation:
```ts
class Foo extends Bar {
public foo = 1;
}
```
```js
class Foo extends Bar {
constructor(…args) {
super(…args);
this.foo = 1;
}
}
```
This introduces an unneeded local variable and might force a reification
of the `arguments` object (or otherwise reify the arguments into an
array).
This is particularly bad when that output is fed into another transpiler
like Babel. In Babel, you get something like this today:
```js
var Foo = (function (_Bar) {
_inherits(Foo, _Bar);
function Foo() {
_classCallCheck(this, Foo);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_Bar.call.apply(_Bar, [this].concat(args));
this.foo = 1;
}
return Foo;
})(Bar);
```
This causes a lot of needless work/allocations and some very strange
code (`.call.apply` o_0).
Admittedly, this is not strictly tsc’s problem; it could have done a
deeper analysis of the code and optimized out the extra dance. However,
tsc could also have emitted this simpler, more concise and semantically
equivalent code in the first place:
```js
class Foo extends Bar {
constructor() {
super(…arguments);
this.foo = 1;
}
}
```
Which compiles into the following in Babel:
```js
var Foo = (function (_Bar) {
_inherits(Foo, _Bar);
function Foo() {
_classCallCheck(this, Foo);
_Bar.apply(this, arguments);
this.foo = 1;
}
return Foo;
})(Bar);
```
Which is well-optimized (today) in most engines and much less confusing
to read.
As far as I can tell, the proposed compilation has exactly the same
semantics as before.
Fixes#10175
* Try using runtests-parallel for CI
* Put worker count setting into .travis.yml
* Reduce worker count to 4 - 8 wasnt much different from 4-6 but had contention issues causing timeouts
* Change the shape of the shim layer to support getAutomaticTypeDirectives
* Change the key for looking up automatic type-directives
* Update baselines from change look-up name of type-directives
* Add @currentDirectory into the test
* Update baselines
* Fix linting error
* Address PR: fix spelling mistake
* Instead of return path of the type directive names just return type directive names
When a property is declared in the constructor and on the prototype of
an ES6 class, the property's symbol is discarded in favour of the
method's symbol. That because the usual use for this pattern is to bind
an instance function: `this.m = this.m.bind(this)`. In this case the
type you want really is the method's type.