在这种情况下,当我继承一个类时,基类中的属性无法识别为在扩展类中初始化了。我不确定这是否是打字稿或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();
答案 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();