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

相关问题