如何解决如何正确定义包装第三方类的代理的类型?
我通过将Firestore的Query类包装到Proxy中来为其编写包装。我的代理基本上可以做两件事:
- 如果您调用Query类中存在的函数,则我的代理将您的函数调用转发到Query类。
- 然后,如果Query类返回自身的另一个实例(例如,当您调用
.where()
时),则我的代理不会返回该查询实例,而是将我的Query实例包装在另一个代理中。 - 但是,如果返回类型不是Query的另一个实例(例如,当您调用
.onSnapshot()
时),那么结果将透明地返回给方法的调用者,而不会发生任何包装。
- 然后,如果Query类返回自身的另一个实例(例如,当您调用
- 我的代理添加了一些我想方便使用的方法。
我的第一次尝试是按如下方式编写类型定义:
interface MyInterface { /* this contains my own methods */ }
type Store = MyInterface & FirebaseFirestore.Query
仅在以下情况下有效:我在商店上调用查询方法时,打字稿理解该方法可用。但是,当然,这对于打字稿而言并不清楚,所有查询方法的返回类型都将被包装为另一种Store
类型。如何将其传达给打字稿?
解决方法
我认为您需要这样的东西:
interface Snapshot {}
interface Helper {}
interface Query {
where(a: number): Query;
onSnapshot(): Snapshot;
}
type ProxyWrapper<T> = {
[K in keyof T]: T[K] extends (...a: any) => T
? (...a: Parameters<T[K]>) => ProxyWrapper<T>
: T[K]
};
interface ProxyExt {
newMethod(): Helper;
}
let proxy: ProxyWrapper<Query> & ProxyExt;
proxy.onSnapshot(); // Snapshot
proxy.where(2); // Proxy<Query>
proxy.newMethod(); // Helper
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。