如何获取类实例仅包含公共方法的类型(排除私有方法)
如何获取类实例仅包含公共方法的类型(排除私有方法)
我完全懂你的痛点——用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
相关产品推荐
相关产品推荐

