【问题标题】:Call signatures are incompatible within interfaces with params调用签名在带有参数的接口中不兼容
【发布时间】:2014-01-17 19:22:07
【问题描述】:

我有两个接口:IEventIWorkflowResizedEvent,它们扩展了第一个接口。

interface IEvent {
    add?(listener: ()=> void): void;
    remove?(listener: ()=> void): void;
    trigger?(...a: any[]): void;
}

interface IWorkflowResizedEvent extends IEvent {
    add(listener:(args: WorkflowResizedEventArgs) => void): void;
    remove(listener:(args: WorkflowResizedEventArgs) => void ): void;
    trigger(args: WorkflowResizedEventArgs): void;
}

interface WorkflowResizedEventArgs {
}

我收到一个错误:

接口“IWorkflowResizedEvent”不能扩展接口“IEvent”: “IWorkflowResizedEvent”类型的属性“触发器”类型和 'IEvent' 不兼容:类型的调用签名 '(args: WorkflowResizedEventArgs) => void' 和 '(...a: any()) => void' 是 不兼容:调用签名需要 0 个或更少的参数。

我之前使用了一些旧版本的TypeScript 库,这段代码运行良好......现在我已将库更新为最新版本,问题开始了。我发现整个语言规范发生了如此强烈的变化......

有人知道这里出了什么问题吗?看起来应该没问题。

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    TypeScript 中,...(所谓的 spread 运算符)代表我们从 C# 中知道的 params
    根据新标准,您将在方法调用/覆盖中使用扩展运算符。这就是为什么IWorkflowResizedEvent 不能扩展IEvent

    试试这个:

    interface IEvent {
        add?(listener: ()=> void): void;
        remove?(listener: ()=> void): void;
        trigger?(...a: any[]): void;
    }
    
    interface IWorkflowResizedEvent extends IEvent {
        add(listener:(args: WorkflowResizedEventArgs) => void): void;
        remove(listener:(args: WorkflowResizedEventArgs) => void ): void;
        trigger(...args: WorkflowResizedEventArgs[]): void;
    }
    
    interface WorkflowResizedEventArgs {
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-28
      • 2019-09-23
      • 2017-12-29
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 2013-02-07
      • 1970-01-01
      相关资源
      最近更新 更多