2017-02-07 3 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

このような配列を初期化すると、実際にはポストタイプのコンストラクタ関数が呼び出されないという問題があります。

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

何が今やっていることはただ、基本的に実際のPostタイプといくつか重複したプロパティ名を持つことが起こる匿名型であるものを提供しています。

もう1つの方法は、Object.assign()を使用して、あるオブジェクトから別のオブジェクトにプロパティをコピーできるようにすることです。このようにして、HTTPレスポンスの値を実際のポストオブジェクトにマージするのは簡単です。

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

あなたがこれを行うとしたら、私は、あなたが手動で呼び出すPostクラスの別の方法にあなたの計算されたプロパティの計算を移動するお勧めします。これは、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

ありがとうございます!私はあなたが示唆した第二の方法と一緒に行くつもりです。 1時間で何時間も! – mikey8989

関連する問題