You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Typescript mixin调用基类方法报not a function错误如何解决

错误原因

sayHello是User类的实例方法,仅类的实例对象可以调用,你代码中直接调用的Base是类构造函数本身,构造函数上并没有挂载这个实例方法,因此会抛出找不到方法的错误。

解决方案

只需做两处调整即可实现需求:

  1. 给mixin的泛型添加约束,限定传入的基类必须包含你需要调用的实例方法,避免类型报错
  2. 混入类的方法中直接通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 10:24:04