typescript扩展基类对象属性

时间:2016-12-07 02:23:53

标签: typescript

首先,我道歉,我对OO编程完全陌生,我确信有一个更好的方式来解决这个问题(一个可能会产生搜索结果或10个问题)。

所以,为了让我的生活变得轻松,并在这里解释我想要做的事情

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

我尝试这样做时出错了。我基本上需要基类作为模板,并使用扩展类在这里和那里扩展一些东西。否则它只需要所有其他属性(我只是不想为每个类重新键入它们)

4 个答案:

答案 0 :(得分:5)

这就是你在打字稿中的表现方式

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 :(得分: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';
  }

}

答案 2 :(得分:1)

由于公认的答案是没有打字的TypeScript,我觉得有必要展示一个有打字的例子。

    interface PropertyA {
      itemA?: string;
      itemB?: string;
      itemC?: string;
    }

    class A {
      propertyA: PropertyA = {
        itemA: "a",
        itemB: "b".
        itemC: "c"
      }
    }

    interface PropertyAextended extends PropertyA {
      itemD?: string;
    }

    class B extends A {
      // This will prevent TS2339: Property 'itemD' does not exist on type 'PropertyA'.
      propertyA: PropertyAextended;

      constructor(){
        super();
        this.propertyA.itemD = "d";
      }
    }


    const x = new B();
    console.log(x.propertyA.itemD);

答案 3 :(得分: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