Typescript mixin调用基类方法报not a function错误如何解决
错误原因
sayHello是User类的实例方法,仅类的实例对象可以调用,你代码中直接调用的Base是类构造函数本身,构造函数上并没有挂载这个实例方法,因此会抛出找不到方法的错误。
解决方案
只需做两处调整即可实现需求:
- 给mixin的泛型添加约束,限定传入的基类必须包含你需要调用的实例方法,避免类型报错
- 混入类的方法中直接通过
this访问基类的实例方法即可,因为你返回的类已经继承了传入的基类,this会自动沿着原型链查找对应方法
修正后的完整代码如下:
//////////////////// // Simple class class User { sayHello(msg:string){ console.log(msg) } } // 通用构造函数类型 type Constructor<T = {}> = new (...args: any[]) => T; //////////////////// // 给泛型添加约束:传入的基类构造出的实例必须包含sayHello方法 function Activatable<TBase extends Constructor<{sayHello: (msg: string) => void}>>(Base: TBase) { return class extends Base { activate() { // 直接通过this调用基类实例方法 this.sayHello("activated") } }; } //////////////////// // 使用组合后的类 const ActivableUser = Activatable(User) const activableUser = new ActivableUser() activableUser.activate() // 正常输出:activated
补充说明
如果你需要调用的是基类的静态方法,才需要直接通过Base.xxx的方式调用,静态方法是直接挂载在构造函数对象上的。
内容的提问来源于stack exchange,提问作者hyperbotauthor
相关产品推荐
相关产品推荐

