【发布时间】:2020-03-03 00:11:02
【问题描述】:
我有一个使用 TypeScript (3.6.3) 编程的 React Native 应用程序。我有以下代码(实际代码来自 API 库,但这是一个最小的可重现示例):
class Base{
someVal: string[];
constructor() {
this.someVal = [];
}
someMethod<T extends Base>(this: T, ...someArgs:string[]){
debugger;
this.someVal = someArgs;
}
}
class Derived extends Base{
}
let myVar = new Derived().someMethod('hello');
代码完全模仿库代码,并且行为相同(错误)。没有编译器错误或警告。当我运行代码时,我希望someArgs 是['hello'],但它是undefined。另外,我有一个 arguments 数组,其中包含 ['hello'] 的实际值:
此时代码(由 Babel 动态编译)就像 Javascript(因此,未定义的实际变量和幻像参数变量)。为什么它没有正确转译,我该如何解决? (我在 Babel 核心/运行时 7.6.2)
这是生成的index.bundle的相关代码:
var Base = function () {
function Base() {
(0, _classCallCheck2.default)(this, Base);
this.someVal = [];
}
(0, _createClass2.default)(Base, [{
key: "someMethod",
value: function someMethod() {
debugger;
for (var _len = arguments.length, someArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
someArgs[_key - 1] = arguments[_key];
}
this.someVal = someArgs;
}
}]);
return Base;
}();
var Derived = function (_Base) {
(0, _inherits2.default)(Derived, _Base);
function Derived() {
(0, _classCallCheck2.default)(this, Derived);
return (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(Derived).apply(this, arguments));
}
return Derived;
}(Base);
var myVar = new Derived().someMethod('hello');
【问题讨论】:
-
您的代码似乎在 Typescript 操场上运行良好。
-
@Pointy 是的,可能。但它不是,当用 Babel 编译时。
-
那么 JavaScript 是什么样的?在操场上看起来不错(当然)。
-
@Pointy 它产生了一个大胖子
index.bundle,如果你需要的话,我已经用相关部分更新了问题。 -
很明显,生成的代码完全是错误的。它将
this参数视为实际的正式参数。
标签: javascript typescript react-native babeljs