首先,我道歉,我对OO编程完全陌生,我确信有一个更好的方式来解决这个问题(一个可能会产生搜索结果或10个问题)。
所以,为了让我的生活变得轻松,并在这里解释我想要做的事情
class A {
propertyA = {
itemA: "a",
itemB: "b".
itemC: "c"
}
propertyB = {
itemA: "A"
}
}
class B extends A {
propertyA.itemD = "d";
propertyB.itemB = "B";
}
我尝试这样做时出错了。我基本上需要基类作为模板,并使用扩展类在这里和那里扩展一些东西。否则它只需要所有其他属性(我只是不想为每个类重新键入它们)
答案 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