Typescript 无法记录继承类中定义的属性

Typescript 无法记录继承类中定义的属性,typescript,Typescript,这里我有一个树类,它有一个name prop,因为常青树有name它会被记录下来,但是这不起作用 class Tree { name?: string; constructor() { console.log(this.name); } } class Evergreen extends Tree { name = 'evergreen'; } const x = new Evergreen(); // prints undefined class Tree {

这里我有一个
类,它有一个name prop,因为
常青树
name
它会被记录下来,但是这不起作用

class Tree {
  name?: string;
  constructor() {
    console.log(this.name);
  }
}

class Evergreen extends Tree {
  name = 'evergreen';
}

const x = new Evergreen(); // prints undefined
class Tree {
  name?: string;
  constructor() {
    console.log(this.name);
  }
}

class Evergreen extends Tree {
  name = 'evergreen';
  constructor() {
    super.bind(this)();
  }
}

const x = new Evergreen();
这是通过重新定义构造函数来实现的

class Tree {
  name?: string;
  constructor() {
    console.log(this.name);
  }
}

class Evergreen extends Tree {
  name = 'evergreen';
  constructor() {
    super();
    console.log(this.name);
  }
}

const x = new Evergreen(); // undefined / evergreen
我试图找到一种语法,防止需要不同的构造函数

理想情况下,
super
已绑定,但这不起作用

class Tree {
  name?: string;
  constructor() {
    console.log(this.name);
  }
}

class Evergreen extends Tree {
  name = 'evergreen';
}

const x = new Evergreen(); // prints undefined
class Tree {
  name?: string;
  constructor() {
    console.log(this.name);
  }
}

class Evergreen extends Tree {
  name = 'evergreen';
  constructor() {
    super.bind(this)();
  }
}

const x = new Evergreen();

这根本不是问题。因为OOP就是这样工作的。如果为继承类中的属性定义默认值,则只能在此类及其子类中使用,而不能在任何父类中使用。假设父类中有一个逻辑,该逻辑与该属性的默认值一起工作:

class Parent {
  name?: string;
  
  getNameLength(): string {
    return this.name.length; // It will gives you an error!
  }
}

class Child extends Parent {
  name = 'default';
}
或者像这样:

class Parent {
  name: string; // It will gives you an error!
  
  getNameLength(): string {
    return this.name.length; // Yes, it will correct now
  }
}

class Child extends Parent {
  name = 'default';
}
如果任何人在没有继承类的情况下使用此父类,他如何确保此父类具有默认值的初始值设定项


在本例中,TS和JS运行时的行为绝对正确。您无法覆盖此行为。

这非常奇怪和有趣。显然,有一些方法可以重新构造代码,使其不成为问题,但我无法解释为什么它现在不起作用。