我正在使用具有 d.ts 定义的第三方 api,其中一个类具有如下声明的函数:
export class Bar {
foo(): void;
}
Run Code Online (Sandbox Code Playgroud)
现在,当我创建一个子类的实现时,我想使用 lambda 函数语法
export class Test1 extends Bar {
public foo = (): void => {
//DO Stuff
}
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,因为
“类‘Test1’定义了实例成员属性‘foo’,但扩展类‘Bar’将其定义为实例成员函数。”
我是否需要更改 Bar 类的定义才能使用 lambda 函数?我宁愿不这样做,所以如果有其他解决方案,我将不胜感激!
更新
好的,所以我注意到了一些事情。如果我不extends使用implements,则允许我在 Test1 中使用 lamdba 函数。对我来说,实现一个类听起来很奇怪。Bar-class 确实有点像一个接口,可能是因为它有效吗?
如果您使用implements,您实际上不会从基类继承 - 因此,如果该基类具有您希望访问的其他属性和方法,您会发现它们在您的Test1类中都不存在。
使用时,implements您必须实现结构中指定的所有属性和方法。
这是转译后的 JavaScript:
var Foo = (function () {
function Foo() {
this.foo = function () {
};
}
return Foo;
})();
Run Code Online (Sandbox Code Playgroud)
如果您使用extends编译器,它将发出额外的代码,Test1使用基类的方法和属性扩展您的类。
使用时,extends您可以选择重写方法,但不必实现所有成员,因为您从基类继承它们。
这是转译后的 JavaScript(您可以看到附加代码):
var __extends = this.__extends || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
var Foo = (function (_super) {
__extends(Foo, _super);
function Foo() {
_super.apply(this, arguments);
}
Foo.prototype.foo = function () {
};
return Foo;
})(Bar);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2767 次 |
| 最近记录: |