2014-09-05 51 views
4

我使用的是具有这样一个类都宣称像这样功能的d.ts定义第三方API:是否可以在基类中有函数,但在子类中有lambda函数?

export class Bar { 
    foo(): void; 
} 
现在

当我创建一个子类我想用lambda表达式语法的实现

export class Test1 extends Bar { 
     public foo =(): void => { 
       //DO Stuff 
     } 
    } 

这并不编译,因为

“类‘Test1的’定义实例成员财产‘富’,而是扩大 类‘酒吧’代罚款它作为实例成员函数“。

是否需要更改Bar-class的定义才能使用lambda函数?我宁愿不,所以如果有其他解决方案,我会很感激帮助!

更新

好了,我发现了一些。如果我不是extends使用implements,我可以在Test1中使用lamdba函数。对我来说,实现一个类听起来很奇怪。 Bar-class看起来像一个接口,可能是因为它的作用?

+1

实现只允许*你*,以确保兼容性类型并不做任何的代码生成(如调用'__extends'功能) – basarat 2014-09-05 15:34:14

回答

2

如果您使用implements,则实际上并不会从基类继承 - 因此,如果该基类具有您希望访问的其他属性和方法,则会发现它们全都不在您的类中。

使用implements时,您必须实现结构中指定的所有属性和方法。

这里是transpiled的JavaScript:

var Foo = (function() { 
    function Foo() { 
     this.foo = function() { 
     }; 
    } 
    return Foo; 
})(); 

如果使用extends编译器会发出与基类的方法和属性扩展了您Test1类额外的代码。

使用extends时,您可以选择重写方法,但不必在从基类继承所有成员时实现所有成员。

这里是transpiled的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); 
+0

感谢您的解释!我想我会使用实现,因为基类实际上没有任何实现,我只想要类型兼容性。 – Gustav 2014-09-08 05:46:26

+0

但是你有什么解释,为什么我被允许在使用器具时使用lambda样式函数,但不是当我扩展时? – Gustav 2014-09-08 05:47:21

+0

这是TypeScript编译器中的规则。你可能会争辩说规则应该改变,但它可以防止你从子类继承的一些细微问题(你不能覆盖基类的属性,只有方法)。 – Fenton 2014-09-08 08:53:04

相关问题