【问题标题】:Creating an anonymous object that implements an interface with overloaded functions创建一个实现具有重载函数的接口的匿名对象
【发布时间】:2017-12-12 07:51:51
【问题描述】:

我有一个 TypeScript 接口,它有一个名为“send”的函数,该函数被两个允许的签名重载。

export interface ConnectionContext {
    send(data: ConnectionData): void;
    send(data: ConnectionData, timeout: number): Promise<ConnectionData>;
}

我正在尝试创建一个实现此接口的匿名对象:

const context: ConnectionContext = {
    send: (data: ConnectionData, timeout?: number): void | Promise<ConnectionData> => {
        // 
    }
};

但是,TypeScript 2.4.1 会产生以下错误:

Error:(58, 15) TS2322:Type '{ send: (data: ConnectionData, timeout?: number | undefined) =&gt; void | Promise&lt;ConnectionData&gt;; }' is not assignable to type 'ConnectionContext'.

Types of property 'send' are incompatible.

Type '(data: ConnectionData, timeout?: number | undefined) =&gt; void | Promise&lt;ConnectionData&gt;' is not assignable to type '{ (data: ConnectionData): void; (data: ConnectionData, timeout: number): Promise&lt;ConnectionData&gt;; }'.

Type 'void | Promise&lt;ConnectionData&gt;' is not assignable to type 'Promise&lt;ConnectionData&gt;'.

Type 'void' is not assignable to type 'Promise&lt;ConnectionData&gt;'.

我知道我可以通过一个班级来做到这一点,但如果有某种方法可以在没有班级的情况下做到这一点,我宁愿不创建整个班级。

【问题讨论】:

  • 我也遇到了类似的问题,也很想知道这个问题的一般答案。

标签: typescript interface anonymous-types overloading


【解决方案1】:

想通了 - 如果函数具有重载签名,请将基本函数键入为 any。这是违反直觉的,但 TypeScript 目前是这样工作的。

固定代码:

export interface ConnectionContext {
  send(data: ConnectionData): void;
  send(data: ConnectionData, timeout: number): Promise<ConnectionData>;
}

const context: ConnectionContext = {
  send: (data: ConnectionData, timeout?: number): any => {}
};

let a = context.send(1)     // void
let b = context.send(1, 2)  // Promise<ConnectionData>

TypeScript playground link

查看TypeScript Handbook's functions section的最后一段:

请注意,function pickCard(x): any 不是重载列表的一部分,因此它只有两个重载:一个接受对象,另一个接受数字。使用任何其他参数类型调用 pickCard 会导致错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2016-02-06
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多