2017-02-07 10 views
0

我想創建一個類,該類自動獲取屬性numberOnenumberTwo之間的差異,並自動將結果分配給numberThree當一個數組鍵入到該類中時,是否可以在構造函數中執行操作

除非將類指定爲數組類型,否則這適用。發生錯誤,指出缺少屬性並且無法將數組類型指定爲鍵入Post。

刪除numberThree屬性聲明只是拋出另一個錯誤,說numberThree是一個未解決的變量。

看起來很簡單。我想我錯過了與財產申報有關的事情。這是非常重要的,因爲將來,這是一個將被分配給來自http請求的數據的類,該請求將具有從返回的數據創建的多個新屬性。

export class Post { 
    numberOne: number; 
    numberTwo: number; 
    numberThree: number 


    constructor(numberOne: number, numberTwo: number) { 
     this.numberThree = this.numberOne - this.numberTwo; 
    } 


} 

export var POSTS: Post[] = [ 
    { numberOne: 11, numberTwo: 10 }, 
    { numberOne: 11, numberTwo: 10 }, 
    { numberOne: 11, numberTwo: 10 }, 
    { numberOne: 11, numberTwo: 10 }, 
    { numberOne: 11, numberTwo: 10 } 
]; 


ERROR in [default] 
Type '{ numberOne: number; numberTwo: number; }[]' is not assignable to type 'Post[]'. 
    Type '{ numberOne: number; numberTwo: number; }' is not assignable to type 'Post'. 
    Property 'numberThree' is missing in type '{ numberOne: number; numberTwo: number; }'. 

回答

2

問題是當你像這樣初始化數組時,實際上並沒有調用Post類型的構造函數。

export var POSTS: Post[] = [ 
    new Post(11, 10), // this will actually execute your custom logic now 
    new Post(11, 10), 
    ... 
]; 

你現在正在做的僅僅是提供什麼本質上是恰好有一些重疊的屬性名稱與實際Post類型匿名類型。

另一種可以這樣做的方法是使用Object.assign(),它允許您將屬性從一個對象複製到另一個對象。通過這種方式,很容易將HTTP響應中的值合併到實際的post對象上。

let mergedPost = Object.assign(new Post(), httPResponseThatLooksLikePost); 

如果你要做到這一點,那麼我建議你的計算性能的移動計算向早報類手動調用的另一種方法。這是因爲雖然Object.assign將屬性從一個對象移動到另一個對象,但它仍然會在不調用構造函數的情況下執行此操作。當是這樣的時候的用法;

class Post() { 
    assignValues() { 
     this.numberThree = this.numberOne + this.NumberTwo; 
    } 
} 

mergedPost.assignValues(); // on the result of .assign(). You're good to go now! 
+0

嘿,明白了!我會用你建議的第二種方式去做。在一個問題上這麼多小時! – mikey8989

相關問題