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

如何获取类实例仅包含公共方法的类型(排除私有方法)

如何获取类实例仅包含公共方法的类型(排除私有方法)

我完全懂你的痛点——用InstanceType拿到的类实例类型会把私有方法也包含进来,这对于测试时mock公共接口来说太折腾了,毕竟你只需要和公开的方法签名匹配就行,而且那些自动生成的复杂类型手动声明也不现实。

给你一个简单又精准的解决方案:自己封装一个工具类型,专门提取类实例的仅公共成员类型,核心是利用类的原型对象只包含公共实例方法的特性:

// 定义专属工具类型
type PublicInstanceType<T extends new (...args: any[]) => any> = 
  Pick<InstanceType<T>, keyof T["prototype"]>;

接着把这个工具类型用到你的代码里:

type SomeComplicatedType = "a" | "b" | "c";
async function fetchSomeComplicatedType(): Promise<SomeComplicatedType> { 
  throw new Error("not implemented"); 
}

class MyClass {
  private myPrivateMethod() { }
  public getTheThing() {
    return fetchSomeComplicatedType();
  }
}

// 现在这个类型只包含公共方法getTheThing,完全符合测试需求
type MyClassInstance = PublicInstanceType<typeof MyClass>;

// 测试用的mock实例,再也不会要求你实现私有方法了
const testInstance: MyClassInstance = { 
  getTheThing: () => Promise.resolve("a") 
};

为什么这个方法能行?其实原理很简单:类的私有方法是内部成员,不会暴露在类的原型对象(T["prototype"])上,所以keyof T["prototype"]只会拿到公共实例方法的键名。再用Pick工具从InstanceType<T>里筛选出这些键对应的类型,就得到了仅包含公共方法的实例类型,完美避开了私有成员的要求。

而且这个方法还能自动保留那些openapi-fetch生成的复杂返回类型,完全不需要你手动声明,刚好匹配你的使用场景。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.09 03:04:35