Closed mlegenhausen closed 7 years ago
Never mind. The problem was not in this babel plugin, simply had some wired behaviour in getting this stuff working with webpack, typescript and awesome-typescript-loader. For everyone looking around for a configuration here is mine:
// tsconfig.js
{
...
"awesomeTypescriptLoaderOptions": {
"useBabel": true,
"babelOptions": {
"plugins": ["angularjs-annotate"],
"presets": ["es2015"]
}
}
}
Don't try to chain awesome-typescript-loader
with babel-loader
this will create the above described error.
Extended ES6 classes seem to work fine.
class foo extends bar {
constructor($scope){
"ngInject";
super();
}
}
new foo();
Yields
"use strict";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var foo = function (_bar) {
foo.$inject = ["$scope"];
_inherits(foo, _bar);
function foo($scope) {
"ngInject";
_classCallCheck(this, foo);
return _possibleConstructorReturn(this, Object.getPrototypeOf(foo).call(this));
}
return foo;
}(bar);
new foo();
In this example, $inject
is defined before _inherits(foo,_bar)
is called.
I don't quite understand why this isn't happening with awesome-typescript-loader
, but there may be nothing that we can do about it (particularly if the TS loader is invoked after Babel).
If you don't have any objections, I'm going to close this, as I'm not sure there's anything else to do at this point.
It seems a class that is extended by another class is not annotated correctly. Following code is generated by
babel-plugin-angularjs-annotate
:for comparision the code that is generated when I use
ng-annotate
afterbabel
was executed:Note that the
$inject
is placed below the comment which seems better and that is added after__extends
was called.It resulting error is that the
this
context seems to get compromised and the instantiated class is not working correctly. Will try to dig a little bit deeper in the problem. Maybe you have an idea what the cause can be.