2016-12-07 160 views
2

首先,我很抱歉,我完全不熟悉面向對象編程,並且我確信有更好的方法來說出這個問題(可能會產生搜索結果或10) 。typescript擴展基類對象屬性

因此,爲了使我的生活輕鬆,並解釋我想在這裏做的代碼

class A { 
    propertyA = { 
    itemA: "a", 
    itemB: "b". 
    itemC: "c" 
    } 
    propertyB = { 
    itemA: "A" 
    } 
} 
class B extends A { 
    propertyA.itemD = "d"; 
    propertyB.itemB = "B"; 
} 

我得到一個錯誤,當我嘗試這樣做。我基本上需要基類作爲模板,並在擴展類中擴展一些東西。否則,只需要所有其他屬性(我只是不想重新輸入他們每類)

回答

4

這是你如何做到這一點的打字稿

class A { 
    propertyA = { 
    itemA: "a", 
    itemB: "b". 
    itemC: "c" 
    } 
    propertyB = { 
    itemA: "A" 
    } 
} 
class B extends A { 
    constructor(){ 
    super(); 
    this.propertyA.itemD = "d"; 
    this.propertyB.itemB = "B"; 
    } 
} 


var x = new B(); 
console.log(x.propertyA.itemD); 
+1

*嘆*我知道這將是可笑的東西容易。很容易回答。標記和upvoted。 – Akidi

+0

這是我想念普通ol'javaScript的東西。動態擴展對象的能力 –

2

接受的答案還是給了我打字稿警告,當輸入我的對象屬性。您可以抑制property does not exist on type警告,如果你必須完全重新申報父對象的屬性選項,如下所示:

class A { 

    propertyA: { 
    itemA: string 
    } = { 
    itemA: '123' 
    }; 

} 

class B extends A { 

    propertyA: { 
    itemA?: string, // Need to re-declare this 
    itemB?: string 
    } = { 
    itemA: '123', // Need to re-initialise this 
    itemB: '456' 
    }; 

} 

這個工作最好的,如果你的時候都宣稱不初始化屬性,而是在構造函數或其他方法如果可能。這就意味着,你不需要知道什麼A級初始化的屬性,除非你專門重寫它:

class A { 

    propertyA: { 
    itemA?: string 
    } = {}; 

    constructor() { 
    this.propertyA.itemA = '123'; // Now we don't need to do this in derived classes 
    } 

} 

class B extends A { 

    propertyA: { 
    itemA?: string, // Need to re-declare this 
    itemB?: string 
    } = {}; 

    constructor() { 
    super(); 
    this.propertyA.itemB = '456'; 
    } 

} 
0

不知道這是否是解決它的正確的方法,但是這是我結束了:

class A { 
    propertyA: any = { 
     itemA: 'a', 
     itemB: 'b', 
     itemC: 'c' 
    } 
    propertyB: any = { 
     itemA: 'A' 
    } 
} 
class B extends A { 
    propertyA: any = { 
     ...this.propertyA, 
     ...{ 
      itemD: 'd' 
     } 
    }; 
    propertyB: any = { 
     ...this.propertyB, 
     ...{ 
      itemB: 'B' 
     } 
    } 
} 

B類的一個新實例將有{ itemA: 'a', itemB: 'b', itemC: 'c', itemD: 'd' }propertyA{ itemA: 'A', itemB: 'B' }作爲propertyB