类未继承属性初始化状态

时间:2019-04-15 21:02:07

标签: node.js typescript

在这种情况下,当我继承一个类时,基类中的属性无法识别为在扩展类中初始化了。我不确定这是否是打字稿或tslint的问题,并且我在Google上找不到任何内容(也许未搜索正确的内容)。

  

(属性)BaseClass.myProperty:IMyProperty |未定义的对象是   可能是'undefined'.ts(2532)

tsconfig.json

{
  "compilerOptions": {
    "strict": true
  }
}

example.ts

interface IMyProperty{
  myName: string;
}

class BaseClass {
  readonly myProperty: IMyProperty | undefined;
  constructor(options: IMyProperty){
    this.myProperty = options
  }
}

class ExtendedClass extends BaseClass{
  constructor(options: IMyProperty){
    super(options)
  }

  printMyName(){
    console.log(this.myProperty.myName); // <-- Complains about this
  }
}

const extendedClass = new ExtendedClass({myName: 'John Smith'});
extendedClass.printMyName();

3 个答案:

答案 0 :(得分:-1)

由于您声明myProperty可能是未定义的,因此TypeScript必须抱怨访问可能未定义的值。这是因为TS无法知道您是否不在代码中的其他地方重新分配值。

const extendedClass = new ExtendedClass({myName: 'John Smith'});
extendedClass.myProperty = undefined
extendedClass.printMyName(); // Would throw a runtime error.

为了解决此问题,您必须添加保护措施,以检查在执行时是否正确定义了该值。

class ExtendedClass extends BaseClass {
  printMyName() {
    // if (this.myProperty) { ... } would also work.
    if (typeof this.myProperty !== 'undefined') {
      console.log(this.myProperty.myName); // Now it works. TS know it can't be undefined at this point.
    }
  }
}

答案 1 :(得分:-1)

在您的console.log()语句中,您尝试记录myName,但是正如编译器错误所言,this.myProperty可能未定义。因此,不允许使用此语句,因为您无法访问未定义对象(this.myProperty)的属性(myName)。

为什么myProperty完全无法定义?您可以只删除BaseClass中的| undefined吗?这样可以解决您的问题。

答案 2 :(得分:-1)

我想这种方法可以解决这个问题,但看起来还是不太优雅

interface IMyProperty {
    myName: string;
}

class BaseClass {
    readonly myProperty: IMyProperty | undefined;
    constructor(options: IMyProperty) {
        this.myProperty = options
    }
}

class ExtendedClass extends BaseClass {
    readonly myProperty: IMyProperty;

    constructor(options: IMyProperty) {
        super(options);
        this.myProperty = options;
    }

    printMyName() {
        console.log(this.myProperty.myName);
    }
}

const extendedClass = new ExtendedClass({ myName: 'John Smith' });
extendedClass.printMyName();