2016-02-29 25 views
10

爲什麼打字稿派生類沒有相同的變量名?即使這些成員是私人的。有沒有其他辦法,或者我做錯了什麼?typescript派生類不能有相同的變量名?

class ClassTS { 

    private nom: string = "ClaseTS"; 

    constructor() { 

    } 
} 

class ClassTSDer extends ClassTS { 

    private nom: string = "ClassTS"; 

    constructor() { 
     super(); 
    } 
} 

我在用TS練習時發現了這個問題。

Class'ClassTSDer'錯誤地擴展了基類'ClaseTS'。類型 對私人財產'nom'有不同的聲明。 ClassTSDer

類ClassTSDer

你可以,使用保護;是的,但如果我不想使用保護,我是否需要使用其他名稱?

+0

不是「雖然」,但因爲有私人你不能有相同的名稱。你想重寫私有屬性(與父類中的屬性相同的子類總是希望覆蓋它)。 – Szymon

+0

「你可以使用保護」=>我沒有痛苦設置它在父母和孩子班上公開,它的工作原理:D – Guntram

回答

19

屬性必須有不同的名稱。

請記住,在運行時,JavaScript類實例只是對象,而對象只是從鍵到值的映射。屬性名稱是關鍵,並且不能有兩個具有相同名稱的不同鍵。

+2

謝謝你的回答,我以爲我做錯了什麼。或者對此有一個保留字,你的解釋簡而言之,簡單而且非常有用,謝謝你的時間。 –

8

屬性必須有不同的名稱。

如果你看看生成的ES5代碼,你可以看到聲明一個與父類私有屬性相同的子類的屬性將覆蓋父類,從而破壞封裝。

/** 
* ClassTS 
*/ 
var ClassTS = (function() { 
    function ClassTS() { 
     this.nom = "ClaseTS"; 
    } 
    ClassTS.prototype.someMethod = function() { 
     console.log(this.nom); 
    }; 
    return ClassTS; 
}()); 
/** 
* ClassTSDer 
*/ 
var ClassTSDer = (function (_super) { 
    __extends(ClassTSDer, _super); 
    function ClassTSDer() { 
     _super.call(this); 
     this.nom = "ClassTS"; 
    } 
    ClassTSDer.prototype.childMethod = function() { 
     _super.prototype.someMethod.call(this); 
    }; 
    return ClassTSDer; 
}(ClassTS)); 

在這種情況下,從所謂的兒童家長的任何功能將導致this.nom具有代替「ClaseTs」值「ClassTS」正如你從私有財產期待。

編譯器不會抱怨保護屬性(即使它們生成相同的ES5代碼),因爲封裝的期望不再存在。

+1

謝謝你的回答,我以爲我做錯了什麼。或者可能有這個保留字,你說...編譯器不抱怨保護...我不知道謝謝你的時間 –

相關問題