类X声明前被使用报错,继承与静态属性场景如何解决?
解决TypeScript中类声明前使用的错误
哈哈,这个问题我之前写TypeScript的时候也碰到过!核心原因是TypeScript会在定义类Y的时候就立刻初始化它的静态属性childVar,但这时候类X还没完成声明(而且X继承了Y,你还不能直接把X移到Y前面)。给你几个实用的解决办法:
延迟初始化静态属性(推荐)
把直接赋值改成getter,这样childVar会在第一次被访问的时候才初始化,这时候X已经完全定义好了:export abstract class Y { private static _childVar?: X; static get childVar(): X { if (!this._childVar) { this._childVar = new X(); } return this._childVar; } } export class X extends Y { }这个方法完全符合TypeScript的类型检查,而且不会改变原有的属性访问方式——你还是可以像之前一样用
Y.childVar来获取实例。提前声明类X的类型
如果你必须在Y初始化时就创建X的实例,可以先通过declare提前告诉TypeScript类X的存在,之后再实际定义它:// 提前声明X的类型,让Y知道它的存在 declare class X extends Y {} export abstract class Y { static readonly childVar = new X(); } // 实际定义X类 export class X extends Y { }注意在模块中
declare的类只会在当前模块生效,不会污染全局作用域。调整类结构,消除循环初始化依赖
如果业务逻辑允许的话,把静态属性childVar移到X类里面,从根源上避免Y依赖X的初始化:export abstract class Y { } export class X extends Y { static readonly childVar = new X(); }这是最简洁的解决方式,前提是这个静态属性放在
X里更符合业务逻辑。
内容的提问来源于stack exchange,提问作者A.khaled
相关产品推荐
相关产品推荐

