我正在开发一个 Capacitor 插件,我需要定义可能的事件侦听器。
该插件的旧实现有一个大接口,所有可能的侦听器都在同一个文件中,例如:
export interface Plugin {
addListener(
eventName: 'bannerShow',
listenerFunc: (info: any) => void,
): PluginListenerHandle;
addListener(
eventName: 'bannerHide',
listenerFunc: (info: string) => void,
): PluginListenerHandle;
addListener(
eventName: 'rewardShow',
listenerFunc: (info: SomeInterface) => void,
): PluginListenerHandle;
addListener(
eventName: 'rewardHide',
listenerFunc: (info: string) => void,
): PluginListenerHandle;
}
我把它分开了,这样更容易维护:
export interface Plugin extends Banner, Reward {
// General plugin calls here
}
// Other file
export interface Banner {
specificBannerFunction(): void;
addListener(
eventName: 'bannerShow',
listenerFunc: (info: any) => void,
): PluginListenerHandle;
addListener(
eventName: 'bannerHide',
listenerFunc: (info: string) => void,
): PluginListenerHandle;
}
// Other file
export interface Reward {
specificRewardFunction(): string;
addListener(
eventName: 'rewardShow',
listenerFunc: (info: SomeInterface) => void,
): PluginListenerHandle;
addListener(
eventName: 'rewardHide',
listenerFunc: (info: string) => void,
): PluginListenerHandle;
}
问题在于 Typescript 说:
<块引用>接口“插件”不能同时扩展“横幅”和“插页式”类型。 'Banner' 和 'Interstitial' 类型的命名属性 'addListener' 不相同
如何让打字稿知道我正在重载该函数调用?
答案 0 :(得分:2)
我自己对 TS 还是很陌生,所以我不知道您是否可以使用接口来做到这一点,但如果您将 Plugin
接口更改为 type
,您可以使用交集。>
例如代替:
export interface Plugin extends Banner, Reward {
// General plugin calls here
}
你可以这样做:
export type Plugin = Banner & Reward & { /* General plugin calls here */ }