2014-09-05 70 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

相關問題