是否可以在基类中使用函数,而在子类中使用 lambda 函数?

Gus*_*tav 5 typescript

我正在使用具有 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 确实有点像一个接口,可能是因为它有效吗?

Fen*_*ton 3

如果您使用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)