打字稿:如何在扩展第一个接口的另一个接口中重载接口的函数

时间:2021-04-14 19:44:56

标签: typescript

我正在开发一个 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' 不相同

如何让打字稿知道我正在重载该函数调用?

1 个答案:

答案 0 :(得分:2)

我自己对 TS 还是很陌生,所以我不知道您是否可以使用接口来做到这一点,但如果您将 Plugin 接口更改为 type,您可以使用交集。

例如代替:

export interface Plugin extends Banner, Reward {
  // General plugin calls here
}

你可以这样做:

export type Plugin = Banner & Reward & { /* General plugin calls here */ }